@geekmidas/cli 10.0.0-alpha.74 → 10.0.0-alpha.76

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 (161) hide show
  1. package/dist/{LegacyStateStore-D_78eaHM.cjs → LegacyStateStore-DwngfJxr.cjs} +2 -2
  2. package/dist/{LegacyStateStore-D_78eaHM.cjs.map → LegacyStateStore-DwngfJxr.cjs.map} +1 -1
  3. package/dist/{LegacyStateStore-DTo7z924.mjs → LegacyStateStore-dyq07_Ir.mjs} +2 -2
  4. package/dist/{LegacyStateStore-DTo7z924.mjs.map → LegacyStateStore-dyq07_Ir.mjs.map} +1 -1
  5. package/dist/{LocalStateStore-BhrlQIXD.cjs → LocalStateStore-B0NCde8Z.cjs} +2 -2
  6. package/dist/{LocalStateStore-BhrlQIXD.cjs.map → LocalStateStore-B0NCde8Z.cjs.map} +1 -1
  7. package/dist/{LocalStateStore-CNjgkRk4.mjs → LocalStateStore-DLxCCatI.mjs} +2 -2
  8. package/dist/{LocalStateStore-CNjgkRk4.mjs.map → LocalStateStore-DLxCCatI.mjs.map} +1 -1
  9. package/dist/{S3StateStore-oCxRs6HM.cjs → S3StateStore-BOenb-3o.cjs} +2 -2
  10. package/dist/{S3StateStore-oCxRs6HM.cjs.map → S3StateStore-BOenb-3o.cjs.map} +1 -1
  11. package/dist/{S3StateStore-g2P7T_Mo.mjs → S3StateStore-CGK_4hlo.mjs} +2 -2
  12. package/dist/{S3StateStore-g2P7T_Mo.mjs.map → S3StateStore-CGK_4hlo.mjs.map} +1 -1
  13. package/dist/{SSMStateStore-CYenunmK.mjs → SSMStateStore-B_5_RqY-.mjs} +2 -2
  14. package/dist/{SSMStateStore-CYenunmK.mjs.map → SSMStateStore-B_5_RqY-.mjs.map} +1 -1
  15. package/dist/{SSMStateStore-DXp0m7XI.cjs → SSMStateStore-DYeD__7p.cjs} +2 -2
  16. package/dist/{SSMStateStore-DXp0m7XI.cjs.map → SSMStateStore-DYeD__7p.cjs.map} +1 -1
  17. package/dist/{add-BTH7WaH3.mjs → add-B7IMXzou.mjs} +3 -3
  18. package/dist/{add-BTH7WaH3.mjs.map → add-B7IMXzou.mjs.map} +1 -1
  19. package/dist/{add-Djrr12Xc.cjs → add-j2yI3cbS.cjs} +3 -3
  20. package/dist/{add-Djrr12Xc.cjs.map → add-j2yI3cbS.cjs.map} +1 -1
  21. package/dist/{aws-DojzQnLd.mjs → aws-Bja4zGSs.mjs} +13 -9
  22. package/dist/aws-Bja4zGSs.mjs.map +1 -0
  23. package/dist/{aws-DkHdTV-p.cjs → aws-CQAuluiu.cjs} +13 -9
  24. package/dist/aws-CQAuluiu.cjs.map +1 -0
  25. package/dist/awsStore-7VmS_cZR.cjs +54 -0
  26. package/dist/awsStore-7VmS_cZR.cjs.map +1 -0
  27. package/dist/awsStore-B529csle.mjs +43 -0
  28. package/dist/awsStore-B529csle.mjs.map +1 -0
  29. package/dist/{bundler-utHuESvL.cjs → bundler-Cf6OgaOe.cjs} +5 -5
  30. package/dist/bundler-Cf6OgaOe.cjs.map +1 -0
  31. package/dist/{bundler-BUojOkof.mjs → bundler-DO6bHhnb.mjs} +5 -5
  32. package/dist/bundler-DO6bHhnb.mjs.map +1 -0
  33. package/dist/{cli-CyYceKTS.mjs → cli-BCPOHmg9.mjs} +3 -3
  34. package/dist/{cli-CyYceKTS.mjs.map → cli-BCPOHmg9.mjs.map} +1 -1
  35. package/dist/{cli-Bx0sUzxH.cjs → cli-CNanUB7a.cjs} +3 -3
  36. package/dist/{cli-Bx0sUzxH.cjs.map → cli-CNanUB7a.cjs.map} +1 -1
  37. package/dist/{compose-DZp8DJ0A.mjs → compose-Dq4VCtu5.mjs} +221 -153
  38. package/dist/compose-Dq4VCtu5.mjs.map +1 -0
  39. package/dist/{compose-iuw8wfHk.cjs → compose-h_6oNnHC.cjs} +243 -151
  40. package/dist/compose-h_6oNnHC.cjs.map +1 -0
  41. package/dist/{config-B38YWicj.d.cts → config-CWyhLSY1.d.cts} +3 -3
  42. package/dist/{config-B38YWicj.d.cts.map → config-CWyhLSY1.d.cts.map} +1 -1
  43. package/dist/{config-DA0kRTQe.d.mts → config-CqAvPP-f.d.mts} +3 -3
  44. package/dist/{config-DA0kRTQe.d.mts.map → config-CqAvPP-f.d.mts.map} +1 -1
  45. package/dist/config.cjs +1 -1
  46. package/dist/config.d.cts +3 -3
  47. package/dist/config.d.mts +3 -3
  48. package/dist/config.mjs +1 -1
  49. package/dist/deploy/public.cjs +7 -6
  50. package/dist/deploy/public.d.cts +14 -3
  51. package/dist/deploy/public.d.cts.map +1 -1
  52. package/dist/deploy/public.d.mts +14 -3
  53. package/dist/deploy/public.d.mts.map +1 -1
  54. package/dist/deploy/public.mjs +7 -7
  55. package/dist/{deploy-eWorhvQp.cjs → deploy-CT3R9de9.cjs} +27 -5
  56. package/dist/deploy-CT3R9de9.cjs.map +1 -0
  57. package/dist/{deploy-C17K7Imy.mjs → deploy-CVXEx7Nm.mjs} +22 -6
  58. package/dist/deploy-CVXEx7Nm.mjs.map +1 -0
  59. package/dist/{dokploy-DKa49Nqm.mjs → dokploy-CYm2ozFs.mjs} +2 -2
  60. package/dist/{dokploy-DKa49Nqm.mjs.map → dokploy-CYm2ozFs.mjs.map} +1 -1
  61. package/dist/{dokploy-DKzcI-RL.cjs → dokploy-eSGmlhhj.cjs} +2 -2
  62. package/dist/{dokploy-DKzcI-RL.cjs.map → dokploy-eSGmlhhj.cjs.map} +1 -1
  63. package/dist/{encryption-sTMz3aWi.mjs → encryption-DC0rsR1W.mjs} +3 -3
  64. package/dist/{encryption-sTMz3aWi.mjs.map → encryption-DC0rsR1W.mjs.map} +1 -1
  65. package/dist/{encryption-DSkJdoyk.cjs → encryption-vS3Qzw73.cjs} +3 -3
  66. package/dist/{encryption-DSkJdoyk.cjs.map → encryption-vS3Qzw73.cjs.map} +1 -1
  67. package/dist/{engine-B1b4I34Z.mjs → engine-BOO5TWZd.mjs} +193 -5
  68. package/dist/engine-BOO5TWZd.mjs.map +1 -0
  69. package/dist/{engine-Bh76sAHy.cjs → engine-C0N2d1i5.cjs} +196 -8
  70. package/dist/engine-C0N2d1i5.cjs.map +1 -0
  71. package/dist/{github-C9ODoyZU.mjs → github-CEaFDL6t.mjs} +6 -6
  72. package/dist/github-CEaFDL6t.mjs.map +1 -0
  73. package/dist/{github-BvN3CfxM.cjs → github-ClkdCOL9.cjs} +6 -6
  74. package/dist/github-ClkdCOL9.cjs.map +1 -0
  75. package/dist/{index-B-1lLGzy.d.mts → index-Ccu0f_2m.d.cts} +2 -2
  76. package/dist/{index-B-1lLGzy.d.mts.map → index-Ccu0f_2m.d.cts.map} +1 -1
  77. package/dist/{index-vMidfqhU.d.cts → index-DOxmDKqv.d.mts} +2 -2
  78. package/dist/{index-vMidfqhU.d.cts.map → index-DOxmDKqv.d.mts.map} +1 -1
  79. package/dist/index.cjs +106 -52
  80. package/dist/index.cjs.map +1 -1
  81. package/dist/index.mjs +105 -51
  82. package/dist/index.mjs.map +1 -1
  83. package/dist/migrate-BRbYtFXG.cjs +93 -0
  84. package/dist/migrate-BRbYtFXG.cjs.map +1 -0
  85. package/dist/migrate-D3NAT7Ns.mjs +93 -0
  86. package/dist/migrate-D3NAT7Ns.mjs.map +1 -0
  87. package/dist/{migrate-B0FCZNkp.cjs → migrate-D5_-ylI1.cjs} +3 -3
  88. package/dist/{migrate-B0FCZNkp.cjs.map → migrate-D5_-ylI1.cjs.map} +1 -1
  89. package/dist/{migrate-CTtJhGV9.mjs → migrate-DrO2p9Rl.mjs} +3 -3
  90. package/dist/{migrate-CTtJhGV9.mjs.map → migrate-DrO2p9Rl.mjs.map} +1 -1
  91. package/dist/openapi.cjs +16 -6
  92. package/dist/openapi.cjs.map +1 -1
  93. package/dist/openapi.d.cts +1 -1
  94. package/dist/openapi.d.cts.map +1 -1
  95. package/dist/openapi.d.mts +1 -1
  96. package/dist/openapi.d.mts.map +1 -1
  97. package/dist/openapi.mjs +16 -6
  98. package/dist/openapi.mjs.map +1 -1
  99. package/dist/reconcile/public.d.cts +1 -1
  100. package/dist/reconcile/public.d.mts +1 -1
  101. package/dist/{resolve-DSAXj_47.mjs → resolve-C1muFos5.mjs} +3 -3
  102. package/dist/{resolve-DSAXj_47.mjs.map → resolve-C1muFos5.mjs.map} +1 -1
  103. package/dist/{resolve-D_BU-wKA.cjs → resolve-Fa1Ii0BK.cjs} +3 -3
  104. package/dist/{resolve-D_BU-wKA.cjs.map → resolve-Fa1Ii0BK.cjs.map} +1 -1
  105. package/dist/{rollback-DJy3t696.cjs → rollback-C9N5lKVf.cjs} +5 -5
  106. package/dist/{rollback-DJy3t696.cjs.map → rollback-C9N5lKVf.cjs.map} +1 -1
  107. package/dist/{rollback-CWYTUhfW.mjs → rollback-DeQzbRqM.mjs} +5 -5
  108. package/dist/{rollback-CWYTUhfW.mjs.map → rollback-DeQzbRqM.mjs.map} +1 -1
  109. package/dist/{runtime-BzZD5HHi.d.cts → runtime-BSvzPqXW.d.mts} +2 -2
  110. package/dist/{runtime-BzZD5HHi.d.cts.map → runtime-BSvzPqXW.d.mts.map} +1 -1
  111. package/dist/{runtime-Cm6J6L7n.d.mts → runtime-Cm7QA53H.d.cts} +2 -2
  112. package/dist/{runtime-Cm6J6L7n.d.mts.map → runtime-Cm7QA53H.d.cts.map} +1 -1
  113. package/dist/secretsManager-DUXW3fQt.cjs +70 -0
  114. package/dist/secretsManager-DUXW3fQt.cjs.map +1 -0
  115. package/dist/secretsManager-Ti0oZwsS.mjs +70 -0
  116. package/dist/secretsManager-Ti0oZwsS.mjs.map +1 -0
  117. package/dist/{sniffer-BFmdZpZ2.mjs → sniffer-DR8AlRCk.mjs} +67 -15
  118. package/dist/sniffer-DR8AlRCk.mjs.map +1 -0
  119. package/dist/{sniffer-C-T7dSMN.cjs → sniffer-Y6GQOCXB.cjs} +83 -13
  120. package/dist/sniffer-Y6GQOCXB.cjs.map +1 -0
  121. package/dist/{state-DCwRWyh-.cjs → state-C2qi0iQw.cjs} +241 -334
  122. package/dist/state-C2qi0iQw.cjs.map +1 -0
  123. package/dist/{state-DpkxSwzI.mjs → state-CUecOCNJ.mjs} +213 -306
  124. package/dist/state-CUecOCNJ.mjs.map +1 -0
  125. package/dist/target/public.cjs +1 -1
  126. package/dist/target/public.d.cts +2 -2
  127. package/dist/target/public.d.mts +2 -2
  128. package/dist/target/public.mjs +1 -1
  129. package/dist/{types-TzCChNrA.d.cts → types-BdptGBFS.d.cts} +59 -6
  130. package/dist/types-BdptGBFS.d.cts.map +1 -0
  131. package/dist/{types-Dp9lgx_S.d.mts → types-OxE0OAn2.d.mts} +59 -6
  132. package/dist/types-OxE0OAn2.d.mts.map +1 -0
  133. package/dist/workspace/index.cjs +1 -1
  134. package/dist/workspace/index.d.cts +2 -2
  135. package/dist/workspace/index.d.mts +2 -2
  136. package/dist/workspace/index.mjs +1 -1
  137. package/dist/{workspace-vdrcRI-m.cjs → workspace-DOm81oUo.cjs} +54 -1
  138. package/dist/workspace-DOm81oUo.cjs.map +1 -0
  139. package/dist/{workspace-C7NqCsQF.mjs → workspace-QUTqYmVy.mjs} +43 -2
  140. package/dist/workspace-QUTqYmVy.mjs.map +1 -0
  141. package/package.json +18 -17
  142. package/dist/aws-DkHdTV-p.cjs.map +0 -1
  143. package/dist/aws-DojzQnLd.mjs.map +0 -1
  144. package/dist/bundler-BUojOkof.mjs.map +0 -1
  145. package/dist/bundler-utHuESvL.cjs.map +0 -1
  146. package/dist/compose-DZp8DJ0A.mjs.map +0 -1
  147. package/dist/compose-iuw8wfHk.cjs.map +0 -1
  148. package/dist/deploy-C17K7Imy.mjs.map +0 -1
  149. package/dist/deploy-eWorhvQp.cjs.map +0 -1
  150. package/dist/engine-B1b4I34Z.mjs.map +0 -1
  151. package/dist/engine-Bh76sAHy.cjs.map +0 -1
  152. package/dist/github-BvN3CfxM.cjs.map +0 -1
  153. package/dist/github-C9ODoyZU.mjs.map +0 -1
  154. package/dist/sniffer-BFmdZpZ2.mjs.map +0 -1
  155. package/dist/sniffer-C-T7dSMN.cjs.map +0 -1
  156. package/dist/state-DCwRWyh-.cjs.map +0 -1
  157. package/dist/state-DpkxSwzI.mjs.map +0 -1
  158. package/dist/types-Dp9lgx_S.d.mts.map +0 -1
  159. package/dist/types-TzCChNrA.d.cts.map +0 -1
  160. package/dist/workspace-C7NqCsQF.mjs.map +0 -1
  161. package/dist/workspace-vdrcRI-m.cjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -4,20 +4,20 @@ import { r as DEFAULT_TIMEOUT_MS, t as CommandFailed } from "./run-BJLIerMM.mjs"
4
4
  import { c as getDokployCredentials, f as removeDokployCredentials, i as LocalSandbox, l as getDokployRegistryId, m as storeHostingerToken, p as storeDokployCredentials, s as getCredentialsPath, u as getDokployToken } from "./credentials-pAtB70k3.mjs";
5
5
  import { l as withOwningTsconfigJsx, r as discover, u as ConstructGenerator } from "./discover-BPelzeGW.mjs";
6
6
  import { t as appKey } from "./derive-B4vDpzgP.mjs";
7
- import { A as deployedProblems, D as InvalidStages, O as TEST_STAGE, c as getAppGkmConfig, j as stageProblems, n as allConstructGlobs, s as getAppBuildOrder } from "./workspace-C7NqCsQF.mjs";
7
+ import { A as deployedProblems, D as InvalidStages, O as TEST_STAGE, c as getAppGkmConfig, j as stageProblems, n as allConstructGlobs, s as getAppBuildOrder } from "./workspace-QUTqYmVy.mjs";
8
8
  import { ConfigNotFound, NotABackendApp, NotInAnApp, loadAppConfig, loadConfig, loadWorkspaceConfig, loadWorkspaceSettings, parseModuleConfig } from "./config.mjs";
9
- import { $ as constructGlobs, At as eventsBackendFor, Bt as findAvailablePort, Ft as fakeKey, G as keyFingerprint, H as workerUnits, Ht as loadEnvFiles, J as workerEntryDir, Jt as FileSecretsStore, K as WorkerGenerator, Kt as secretsStoreFor, Lt as primaryPortKey, Pt as describeServices, Q as backendsOf$1, R as parseDevServices, Rt as createCredentialsPreload, Ut as loadSecretsForApp, Vt as isPortAvailable, Wt as prepareEntryCredentials, X as CronGenerator, Y as QueueGenerator, Yt as getKeyPath, Z as FAKE_ENV, Zt as projectKey, cn as maskPassword, dn as withCustomSecret, dt as quoteIdentifier, en as deployIdentity, et as derivedContainers, it as forgetState, jt as providerOf, kt as cacheBackendFor, lt as postgresDatabaseNames, mt as pgClient, q as workerBundleName, rt as LOCAL_CA_PATH, tt as reconcileWorkspace, un as toEmbeddableSecrets, y as dockerCommand, zt as createEntryWrapper } from "./state-DpkxSwzI.mjs";
9
+ import { $ as LOCAL_CA_PATH, At as providerOf, Bt as isPortAvailable, Dt as isImageBuild, Et as imageBuildCredentials, G as QueueGenerator, Gt as secretsStoreFor, H as WorkerGenerator, Ht as loadSecretsForApp, It as primaryPortKey, J as backendsOf$1, Jt as FileSecretsStore, K as CronGenerator, L as parseDevServices, Lt as createCredentialsPreload, Nt as describeServices, Ot as cacheBackendFor, Pt as fakeKey, Rt as createEntryWrapper, U as workerBundleName, Ut as prepareEntryCredentials, V as workerUnits, Vt as loadEnvFiles, W as workerEntryDir, X as derivedContainers, Y as constructGlobs, Yt as getKeyPath, Z as reconcileWorkspace, Zt as projectKey, at as postgresDatabaseNames, cn as maskPassword, dn as withCustomSecret, en as deployIdentity, et as forgetState, kt as eventsBackendFor, q as FAKE_ENV, st as quoteIdentifier, un as toEmbeddableSecrets, ut as pgClient, v as dockerCommand, zt as findAvailablePort } from "./state-CUecOCNJ.mjs";
10
10
  import { i as telemetryFor, n as runtimeFor, t as EndpointGenerator } from "./EndpointGenerator-DftalLYg.mjs";
11
- import { g as createStateStore, n as sniffAppEnvironment, o as DokployApi } from "./sniffer-BFmdZpZ2.mjs";
12
11
  import { generateOpenApi, openapiCommand, resolveOpenApiConfig } from "./openapi.mjs";
13
12
  import { s as isCacheBackend, t as SubscriberGenerator } from "./SubscriberGenerator-5looQ3gB.mjs";
14
13
  import { a as describeHolder, i as assignAppPorts, o as holderOf, r as appTag, s as withAppPorts, t as APP_TAG_ENV } from "./appPorts-C9z9Pzn9.mjs";
15
14
  import { n as driversFor, r as eventsBackendsIn, t as cacheBackendsIn } from "./drivers-Ch1rJitn.mjs";
16
15
  import { n as withCompute, r as withRoutes, t as manifestModule } from "./emit-C1e8qD08.mjs";
17
- import { t as deploy$1 } from "./deploy-C17K7Imy.mjs";
18
- import { a as stackDir, i as composeProject, o as dockerCompose, r as stackOverrideFile, t as composeTarget } from "./compose-DZp8DJ0A.mjs";
16
+ import { g as createStateStore, n as sniffAppEnvironment, o as DokployApi, x as keyFingerprint } from "./sniffer-DR8AlRCk.mjs";
17
+ import { t as deploy$1 } from "./deploy-CVXEx7Nm.mjs";
18
+ import { a as stackOverrideFile, c as parseDigests, i as ComposePushNeedsBuild, l as pinnedRef, o as composeProject, r as ComposePinNeedsPull, s as stackDir, t as composeTarget, u as dockerCompose } from "./compose-Dq4VCtu5.mjs";
19
19
  import { o as loadCredentialSchemas, t as CredentialsInvalid } from "./credentialSchemas-BJqRJNK4.mjs";
20
- import { t as LocalStateStore } from "./LocalStateStore-CNjgkRk4.mjs";
20
+ import { t as LocalStateStore } from "./LocalStateStore-DLxCCatI.mjs";
21
21
  import { a as getExecCommand, c as validateProjectName, i as findWorkspaceRoot, n as detectPackageManager$1, o as getInstallCommand, r as findWorkspacePackages, s as getRunCommand, t as checkDirectoryExists } from "./utils-D_fxUqvU.mjs";
22
22
  import { a as writeTestHarness, i as TEST_MANIFEST_ENV, n as TEST_READY_FILE, t as TEST_READY_ENV } from "./ready-ZZoNskrr.mjs";
23
23
  import { createRequire } from "node:module";
@@ -47,7 +47,7 @@ import crypto from "crypto";
47
47
  import { Function } from "@geekmidas/constructs/functions";
48
48
  import { Topic } from "@geekmidas/constructs/topic";
49
49
  //#region package.json
50
- var version = "10.0.0-alpha.74";
50
+ var version = "10.0.0-alpha.76";
51
51
  //#endregion
52
52
  //#region src/prompt.ts
53
53
  /**
@@ -130,7 +130,7 @@ const logger$8 = console;
130
130
  * Validate Dokploy token by making a test API call
131
131
  */
132
132
  async function validateDokployToken(endpoint, token) {
133
- const { DokployApi } = await import("./sniffer-BFmdZpZ2.mjs").then((n) => n.c);
133
+ const { DokployApi } = await import("./sniffer-DR8AlRCk.mjs").then((n) => n.c);
134
134
  return new DokployApi({
135
135
  baseUrl: endpoint,
136
136
  token
@@ -1527,10 +1527,10 @@ async function execCommand(commandArgs, options = {}) {
1527
1527
  if (!commandArgs[0]) throw new NoCommandSpecified();
1528
1528
  const defaultEnv = loadEnvFiles(".env");
1529
1529
  if (defaultEnv.loaded.length > 0) logger$6.log(`📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
1530
- const { credentials, secretsJsonPath, appName } = await prepareEntryCredentials({ cwd });
1530
+ const { credentials, secretsJsonPath, appName } = isImageBuild() ? await imageBuildEntry(cwd) : await prepareEntryCredentials({ cwd });
1531
1531
  if (appName) logger$6.log(`📦 App: ${appName}`);
1532
1532
  const secretCount = Object.keys(credentials).filter((k) => k !== "PORT").length;
1533
- if (secretCount > 0) logger$6.log(`🔐 Loaded ${secretCount} secret(s)`);
1533
+ if (secretCount > 0 && !isImageBuild()) logger$6.log(`🔐 Loaded ${secretCount} secret(s)`);
1534
1534
  const preloadDir = join(cwd, ".gkm");
1535
1535
  await mkdir(preloadDir, { recursive: true });
1536
1536
  const preloadPath = join(preloadDir, "credentials-preload.mjs");
@@ -1556,6 +1556,23 @@ async function execCommand(commandArgs, options = {}) {
1556
1556
  });
1557
1557
  if (exitCode !== 0) process.exit(exitCode);
1558
1558
  }
1559
+ /**
1560
+ * `gkm exec` inside an image build: the public values the Dockerfile's build
1561
+ * args set, written where the preload reads them. No workspace is loaded, no
1562
+ * secret read and no address resolved.
1563
+ */
1564
+ async function imageBuildEntry(cwd) {
1565
+ const credentials = imageBuildCredentials();
1566
+ logger$6.log(`🐳 Image build: ${Object.keys(credentials).length} public value(s) from the build args`);
1567
+ const dir = join(cwd, ".gkm");
1568
+ await mkdir(dir, { recursive: true });
1569
+ const secretsJsonPath = join(dir, "image-build-env.json");
1570
+ await writeFile(secretsJsonPath, JSON.stringify(credentials, null, 2));
1571
+ return {
1572
+ credentials,
1573
+ secretsJsonPath
1574
+ };
1575
+ }
1559
1576
  //#endregion
1560
1577
  //#region src/dev/index.ts
1561
1578
  const logger$5 = console;
@@ -2036,9 +2053,9 @@ async function workspaceDevCommand(configured, options) {
2036
2053
  for (const { id, port } of fakes) logger$5.log(`🎭 ${id} fake: http://localhost:${port}`);
2037
2054
  logger$5.log(options.migrate || options.seed ? "🗄️ Migrating the databases" : "🗄️ Checking for pending migrations");
2038
2055
  if (options.migrate || options.seed) {
2039
- const { prepareDevDatabases } = await import("./migrate-CTtJhGV9.mjs");
2056
+ const { prepareDevDatabases } = await import("./migrate-DrO2p9Rl.mjs");
2040
2057
  await prepareDevDatabases(workspace, reconciled.env, { seed: !!options.seed });
2041
- } else await import("./migrate-CTtJhGV9.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
2058
+ } else await import("./migrate-DrO2p9Rl.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
2042
2059
  logger$5.log(`⚠️ Could not check for pending migrations: ${error instanceof Error ? error.message : String(error)}`);
2043
2060
  });
2044
2061
  const appUrls = {};
@@ -3046,7 +3063,7 @@ async function buildApp(input) {
3046
3063
  if (production?.bundle && !input.skipBundle) {
3047
3064
  const outputDir = join(appRoot, ".gkm", "server");
3048
3065
  const entryPoint = await writeSurfaceServer(outputDir, production);
3049
- const { bundleServer } = await import("./bundler-BUojOkof.mjs");
3066
+ const { bundleServer } = await import("./bundler-DO6bHhnb.mjs");
3050
3067
  await bundleServer({
3051
3068
  entryPoint,
3052
3069
  outputDir: join(outputDir, "dist"),
@@ -3170,7 +3187,7 @@ async function buildWorkers(input) {
3170
3187
  });
3171
3188
  logger$4.log(`Generated worker ${worker.id}: ${crons.length} crons, ${queues.length} queues, ${subscribers.length} subscribers`);
3172
3189
  if (!input.bundle) continue;
3173
- const { bundleServer } = await import("./bundler-BUojOkof.mjs");
3190
+ const { bundleServer } = await import("./bundler-DO6bHhnb.mjs");
3174
3191
  const outfile = workerBundleName(worker.id);
3175
3192
  await bundleServer({
3176
3193
  entryPoint,
@@ -3240,7 +3257,7 @@ async function buildForTarget(target, context, appRoot, workspaceRoot, endpointG
3240
3257
  let masterKey;
3241
3258
  if (context.production?.bundle && !skipBundle) {
3242
3259
  logger$4.log(`\n📦 Bundling production server...`);
3243
- const { bundleServer } = await import("./bundler-BUojOkof.mjs");
3260
+ const { bundleServer } = await import("./bundler-DO6bHhnb.mjs");
3244
3261
  const allConstructs = [
3245
3262
  ...endpoints.map((e) => e.construct),
3246
3263
  ...functions.map((f) => f.construct),
@@ -3484,9 +3501,16 @@ var ComposeModeConflict = class extends Error {
3484
3501
  this.name = "ComposeModeConflict";
3485
3502
  }
3486
3503
  };
3504
+ /** Each pushed image as `<ref>@sha256:…`, by app. */
3505
+ function pushedDigests(run) {
3506
+ return Object.fromEntries(Object.entries(run.images).filter(([, image]) => image.digest).sort(([a], [b]) => a.localeCompare(b)).map(([app, image]) => [app, pinnedRef(image.ref, image.digest)]));
3507
+ }
3487
3508
  /** `gkm compose`. */
3488
3509
  async function composeCommand(options, deps = {}) {
3489
3510
  if (options.build && options.pull) throw new ComposeModeConflict();
3511
+ if (options.push && !options.build) throw new ComposePushNeedsBuild();
3512
+ const pulls = !options.build && (options.pull || options.tag !== void 0);
3513
+ if (options.digestsFile && !options.push && !pulls) throw new ComposePinNeedsPull();
3490
3514
  const allowDevServices = parseDevServices(options.allowDevServices);
3491
3515
  const cwd = resolve(options.cwd ?? process.cwd());
3492
3516
  const { workspace } = await loadWorkspaceConfig(cwd);
@@ -3506,6 +3530,10 @@ async function composeCommand(options, deps = {}) {
3506
3530
  let finished;
3507
3531
  const mode = options.build ? "build" : options.pull ? "pull" : void 0;
3508
3532
  const tag = options.tag ?? (options.pull ? "latest" : void 0);
3533
+ const pin = options.digestsFile && pulls ? {
3534
+ file: options.digestsFile,
3535
+ digests: parseDigests(options.digestsFile, await readFile(resolve(cwd, options.digestsFile), "utf-8"))
3536
+ } : void 0;
3509
3537
  const result = await deploy$1({
3510
3538
  cwd,
3511
3539
  stage,
@@ -3513,12 +3541,15 @@ async function composeCommand(options, deps = {}) {
3513
3541
  targets: { compose: composeTarget({
3514
3542
  ...deps,
3515
3543
  ...mode ? { mode } : {},
3544
+ ...options.push ? { push: true } : {},
3545
+ ...pin ? { pin } : {},
3516
3546
  report: (done) => {
3517
3547
  finished = done;
3518
3548
  }
3519
3549
  }) },
3520
3550
  ...tag ? { tag } : {},
3521
3551
  ...options.dryRun ? { dryRun: true } : {},
3552
+ ...options.push ? { buildOnly: true } : {},
3522
3553
  ...allowDevServices.length > 0 ? { allowDevServices } : {},
3523
3554
  logger: {
3524
3555
  info: (message) => console.log(message),
@@ -3527,6 +3558,17 @@ async function composeCommand(options, deps = {}) {
3527
3558
  }
3528
3559
  }).result;
3529
3560
  if (!finished) return void 0;
3561
+ if (options.push && !options.dryRun) {
3562
+ const digests = pushedDigests(finished);
3563
+ console.log(`\n✅ Pushed ${Object.keys(digests).length} image(s):`);
3564
+ for (const [app, ref] of Object.entries(digests)) console.log(` ${app.padEnd(12)} ${ref}`);
3565
+ if (options.digestsFile) {
3566
+ const file = resolve(cwd, options.digestsFile);
3567
+ await mkdir(dirname(file), { recursive: true });
3568
+ await writeFile(file, `${JSON.stringify(digests, null, 2)}\n`);
3569
+ console.log(`\n📝 Wrote the digests to ${options.digestsFile}`);
3570
+ }
3571
+ }
3530
3572
  return {
3531
3573
  stack: finished.stack,
3532
3574
  files: finished.files,
@@ -4939,25 +4981,25 @@ function loadPackageJson() {
4939
4981
  * Run: pnpm --filter @geekmidas/cli sync-versions
4940
4982
  */
4941
4983
  const GEEKMIDAS_VERSIONS = {
4942
- "@geekmidas/audit": "~10.0.0-alpha.74",
4943
- "@geekmidas/auth": "~10.0.0-alpha.74",
4944
- "@geekmidas/cache": "~10.0.0-alpha.74",
4945
- "@geekmidas/client": "~10.0.0-alpha.74",
4946
- "@geekmidas/cloud": "~10.0.0-alpha.74",
4947
- "@geekmidas/constructs": "~10.0.0-alpha.74",
4948
- "@geekmidas/db": "~10.0.0-alpha.74",
4949
- "@geekmidas/emailkit": "~10.0.0-alpha.74",
4950
- "@geekmidas/envkit": "~10.0.0-alpha.74",
4951
- "@geekmidas/errors": "~10.0.0-alpha.74",
4952
- "@geekmidas/events": "~10.0.0-alpha.74",
4953
- "@geekmidas/logger": "~10.0.0-alpha.74",
4954
- "@geekmidas/manifest": "~10.0.0-alpha.74",
4955
- "@geekmidas/rate-limit": "~10.0.0-alpha.74",
4956
- "@geekmidas/schema": "~10.0.0-alpha.74",
4957
- "@geekmidas/services": "~10.0.0-alpha.74",
4958
- "@geekmidas/storage": "~10.0.0-alpha.74",
4959
- "@geekmidas/telescope": "~10.0.0-alpha.74",
4960
- "@geekmidas/testkit": "~10.0.0-alpha.74",
4984
+ "@geekmidas/audit": "~10.0.0-alpha.76",
4985
+ "@geekmidas/auth": "~10.0.0-alpha.76",
4986
+ "@geekmidas/cache": "~10.0.0-alpha.76",
4987
+ "@geekmidas/client": "~10.0.0-alpha.76",
4988
+ "@geekmidas/cloud": "~10.0.0-alpha.76",
4989
+ "@geekmidas/constructs": "~10.0.0-alpha.76",
4990
+ "@geekmidas/db": "~10.0.0-alpha.76",
4991
+ "@geekmidas/emailkit": "~10.0.0-alpha.76",
4992
+ "@geekmidas/envkit": "~10.0.0-alpha.76",
4993
+ "@geekmidas/errors": "~10.0.0-alpha.76",
4994
+ "@geekmidas/events": "~10.0.0-alpha.76",
4995
+ "@geekmidas/logger": "~10.0.0-alpha.76",
4996
+ "@geekmidas/manifest": "~10.0.0-alpha.76",
4997
+ "@geekmidas/rate-limit": "~10.0.0-alpha.76",
4998
+ "@geekmidas/schema": "~10.0.0-alpha.76",
4999
+ "@geekmidas/services": "~10.0.0-alpha.76",
5000
+ "@geekmidas/storage": "~10.0.0-alpha.76",
5001
+ "@geekmidas/telescope": "~10.0.0-alpha.76",
5002
+ "@geekmidas/testkit": "~10.0.0-alpha.76",
4961
5003
  "@geekmidas/cli": `~${loadPackageJson().version}`
4962
5004
  };
4963
5005
  //#endregion
@@ -7015,6 +7057,7 @@ function secretsStore(options) {
7015
7057
  return `
7016
7058
  // Deployed stages keep their secrets in SSM, in the account each stage
7017
7059
  // deploys to: \`gkm secrets:set <KEY> '…' --stage <stage>\` writes there.
7060
+ // Past 8 KB a stage needs { provider: 'secrets-manager', region } instead.
7018
7061
  store: { provider: 'ssm', region: '${options.region}' },`;
7019
7062
  }
7020
7063
  /**
@@ -10110,8 +10153,8 @@ ${dbPasswordEntries.map(([key, value]) => `${key}=${value}`).join("\n")}
10110
10153
  //#region src/secrets/index.ts
10111
10154
  const logger$2 = console;
10112
10155
  /**
10113
- * The store the stage named on the command line keeps its secrets in — SSM in
10114
- * its account, for a deployed stage kept there. Outside any workspace nothing
10156
+ * The store the stage named on the command line keeps its secrets in — SSM or
10157
+ * Secrets Manager in its account, for a deployed stage kept there. Outside any workspace nothing
10115
10158
  * names a store, so it is the file.
10116
10159
  */
10117
10160
  async function storeFor(stage) {
@@ -10347,7 +10390,7 @@ const logger$1 = console;
10347
10390
  *
10348
10391
  * Orchestrates:
10349
10392
  * 1. Load workspace config
10350
- * 2. Resolve secrets (local → SSM → generate fresh)
10393
+ * 2. Resolve secrets (local → the stage's store → generate fresh)
10351
10394
  * 3. Write docker/.env from secrets
10352
10395
  * 4. Start Docker services
10353
10396
  */
@@ -10515,7 +10558,7 @@ function reconcileSecrets(secrets, workspace, containers = []) {
10515
10558
  /**
10516
10559
  * Build a fresh StageSecrets object for a workspace: service credentials,
10517
10560
  * connection URLs, and custom secrets. Pure — does not write to disk or touch
10518
- * SSM. Service passwords are freshly randomized, so the result must be the same
10561
+ * any store. Service passwords are freshly randomized, so the result must be the same
10519
10562
  * one used to start the matching Docker containers.
10520
10563
  * @internal Exported for reuse by `gkm test` auto-setup.
10521
10564
  */
@@ -10748,7 +10791,7 @@ function testDatabases(reconciled) {
10748
10791
  * starts without the reference data the app needs.
10749
10792
  */
10750
10793
  async function migrateTestStage(workspace, env) {
10751
- const { migrateAndSeed } = await import("./migrate-CTtJhGV9.mjs");
10794
+ const { migrateAndSeed } = await import("./migrate-DrO2p9Rl.mjs");
10752
10795
  const { discover } = await import("./discover-BPelzeGW.mjs").then((n) => n.i);
10753
10796
  const sources = {};
10754
10797
  const manifest = await discover({
@@ -11181,7 +11224,7 @@ program.command("migrate").description("Apply each database construct's migratio
11181
11224
  try {
11182
11225
  const globalOptions = program.opts();
11183
11226
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11184
- const { migrateCommand } = await import("./migrate-CTtJhGV9.mjs");
11227
+ const { migrateCommand } = await import("./migrate-DrO2p9Rl.mjs");
11185
11228
  await migrateCommand({
11186
11229
  ...options,
11187
11230
  ...construct ? { construct } : {}
@@ -11195,7 +11238,7 @@ program.command("seed").description("Migrate, then run each database construct's
11195
11238
  try {
11196
11239
  const globalOptions = program.opts();
11197
11240
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11198
- const { seedCommand } = await import("./migrate-CTtJhGV9.mjs");
11241
+ const { seedCommand } = await import("./migrate-DrO2p9Rl.mjs");
11199
11242
  await seedCommand({
11200
11243
  ...options,
11201
11244
  ...construct ? { construct } : {}
@@ -11209,7 +11252,7 @@ program.command("migration").description("Write a construct's next migration: an
11209
11252
  try {
11210
11253
  const globalOptions = program.opts();
11211
11254
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11212
- const { migrationCommand } = await import("./migrate-CTtJhGV9.mjs");
11255
+ const { migrationCommand } = await import("./migrate-DrO2p9Rl.mjs");
11213
11256
  await migrationCommand({
11214
11257
  construct,
11215
11258
  ...name ? { name } : {}
@@ -11254,7 +11297,7 @@ program.command("docker").description("Generate Docker deployment files").option
11254
11297
  process.exit(1);
11255
11298
  }
11256
11299
  });
11257
- program.command("compose").description("Run the workspace's APIs and sites for a stage as one Docker Compose stack behind Caddy").requiredOption("--stage <stage>", "Stage to run — always named, so a stack is never a deployed stage by accident").option("--tag <tag>", "Run the images CI pushed at this tag (sites: <tag>-<stage>); nothing is built").option("--build", "Build images from this checkout, tagged with the commit").option("--pull", "Pull images (at --tag, or latest) rather than build them").option("--dry-run", "Write the files and print the plan; start nothing").option("--down", "Stop the stage's stack (its volumes are kept)").option("--allow-dev-services <list>", "Deployed stage: run MinIO and/or Mailpit (minio,mailpit) for mail and buckets the stage's secrets don't configure. Not production-grade").action(async (options) => {
11300
+ program.command("compose").description("Run the workspace's APIs and sites for a stage as one Docker Compose stack behind Caddy").requiredOption("--stage <stage>", "Stage to run — always named, so a stack is never a deployed stage by accident").option("--tag <tag>", "Run the images CI pushed at this tag (sites: <tag>-<stage>); nothing is built").option("--build", "Build images from this checkout, tagged with the commit").option("--pull", "Pull images (at --tag, or latest) rather than build them").option("--push", "With --build: push every image to deploy.registry and start nothing (for CI)").option("--digests-file <path>", "With --push: write each image as <ref>@sha256:… (JSON). With --tag: run the images at those digests").option("--dry-run", "Write the files and print the plan; start nothing").option("--down", "Stop the stage's stack (its volumes are kept)").option("--allow-dev-services <list>", "Deployed stage: run MinIO and/or Mailpit (minio,mailpit) for mail and buckets the stage's secrets don't configure. Not production-grade").action(async (options) => {
11258
11301
  try {
11259
11302
  const globalOptions = program.opts();
11260
11303
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
@@ -11303,7 +11346,7 @@ program.command("secrets:add").description("Build the keys a stage must be given
11303
11346
  try {
11304
11347
  const globalOptions = program.opts();
11305
11348
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11306
- const { secretsAddCommand } = await import("./add-BTH7WaH3.mjs");
11349
+ const { secretsAddCommand } = await import("./add-B7IMXzou.mjs");
11307
11350
  await secretsAddCommand(options);
11308
11351
  } catch (error) {
11309
11352
  console.error(formatError(error));
@@ -11314,7 +11357,7 @@ program.command("encryption:rotate").description("Add a new current key to an En
11314
11357
  try {
11315
11358
  const globalOptions = program.opts();
11316
11359
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11317
- const { encryptionRotateCommand } = await import("./encryption-sTMz3aWi.mjs");
11360
+ const { encryptionRotateCommand } = await import("./encryption-DC0rsR1W.mjs");
11318
11361
  await encryptionRotateCommand(construct, options);
11319
11362
  } catch (error) {
11320
11363
  console.error(formatError(error));
@@ -11325,7 +11368,7 @@ program.command("encryption:retire").description("Remove an old key from an Encr
11325
11368
  try {
11326
11369
  const globalOptions = program.opts();
11327
11370
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11328
- const { encryptionRetireCommand } = await import("./encryption-sTMz3aWi.mjs");
11371
+ const { encryptionRetireCommand } = await import("./encryption-DC0rsR1W.mjs");
11329
11372
  await encryptionRetireCommand(construct, key, options);
11330
11373
  } catch (error) {
11331
11374
  console.error(formatError(error));
@@ -11368,7 +11411,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
11368
11411
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11369
11412
  const { loadWorkspaceConfig } = await import("./config.mjs");
11370
11413
  const { reconcileMissingSecrets } = await import("./reconcile--I7V4Klj.mjs");
11371
- const { secretsStoreFor } = await import("./state-DpkxSwzI.mjs").then((n) => n.qt);
11414
+ const { secretsStoreFor } = await import("./state-CUecOCNJ.mjs").then((n) => n.qt);
11372
11415
  const { workspace } = await loadWorkspaceConfig();
11373
11416
  const stage = options.stage ?? workspace.stages.local;
11374
11417
  const store = await secretsStoreFor(workspace, stage);
@@ -11377,7 +11420,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
11377
11420
  console.error(`No secrets found for stage "${stage}". Run "gkm secrets:init --stage ${stage}" first.`);
11378
11421
  process.exit(1);
11379
11422
  }
11380
- const { derivedContainers } = await import("./state-DpkxSwzI.mjs").then((n) => n.nt);
11423
+ const { derivedContainers } = await import("./state-CUecOCNJ.mjs").then((n) => n.Q);
11381
11424
  const result = reconcileMissingSecrets(secrets, workspace, await derivedContainers(workspace, stage));
11382
11425
  if (!result) {
11383
11426
  console.log(`\n✓ Secrets for stage "${stage}" are up-to-date`);
@@ -11391,8 +11434,19 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
11391
11434
  process.exit(1);
11392
11435
  }
11393
11436
  });
11437
+ program.command("secrets:migrate").description("Copy a deployed stage's secrets from the configured store to another (file, ssm, secrets-manager)").requiredOption("--stage <stage>", "A deployed stage").requiredOption("--to <provider>", "file, ssm or secrets-manager").option("--region <region>", "The target's AWS region (default: the configured store's)").option("--profile <profile>", "AWS profile for the stage's account").option("--force", "Replace a stage the target already holds").action(async (options) => {
11438
+ try {
11439
+ const globalOptions = program.opts();
11440
+ if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11441
+ const { secretsMigrateCommand } = await import("./migrate-D3NAT7Ns.mjs");
11442
+ await secretsMigrateCommand(options);
11443
+ } catch (error) {
11444
+ console.error(formatError(error));
11445
+ process.exit(1);
11446
+ }
11447
+ });
11394
11448
  program.command("deploy").description("Deploy a stage through its target").option("--target <name>", "Deploy target: dokploy, compose, sst, or one named in deploy.targets (default: deploy.default)").option("--provider <provider>", "[DEPRECATED] Use --target instead").requiredOption("--stage <stage>", "Deployment stage (e.g., production, staging)").option("--tag <tag>", "Image tag (default: stage-timestamp; compose: the commit). Compose pulls a given tag").option("--skip-push", "Skip pushing image to registry").option("--skip-build", "Skip build step (use existing build)").option("--json", "Write events as JSON lines instead of progress; never prompts").option("--dry-run", "Show what would be created or reused; change, build and push nothing").option("--atomic", "If the release fails, roll back every app it released, not only the failed ones").option("--allow-dev-services <list>", "Server targets: run MinIO and/or Mailpit (minio,mailpit) for mail and buckets the stage's secrets don't configure. Not production-grade").action(async (options) => {
11395
- const { deployCli } = await import("./cli-CyYceKTS.mjs");
11449
+ const { deployCli } = await import("./cli-BCPOHmg9.mjs");
11396
11450
  const globalOptions = program.opts();
11397
11451
  const code = await deployCli({
11398
11452
  cwd: resolve(globalOptions.cwd ?? process.cwd()),
@@ -11409,7 +11463,7 @@ program.command("deploy").description("Deploy a stage through its target").optio
11409
11463
  });
11410
11464
  program.command("deploy:rollback").description("Put a stage's app back on its previous release (Dokploy): one app with --app, every app with --atomic").requiredOption("--stage <stage>", "A deployed stage").option("--app <app>", "The app to roll back").option("--atomic", "Roll back every app that has an earlier release").action(async (options) => {
11411
11465
  try {
11412
- const { rollbackStage } = await import("./rollback-CWYTUhfW.mjs").then((n) => n.a);
11466
+ const { rollbackStage } = await import("./rollback-DeQzbRqM.mjs").then((n) => n.a);
11413
11467
  const { terminalCredentials } = await import("./terminal-BdvrmkaC.mjs");
11414
11468
  const globalOptions = program.opts();
11415
11469
  await rollbackStage({
@@ -11445,7 +11499,7 @@ program.command("deploy:github").description("Let GitHub Actions deploy a stage:
11445
11499
  try {
11446
11500
  const globalOptions = program.opts();
11447
11501
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11448
- const { deployGithubCommand } = await import("./github-C9ODoyZU.mjs");
11502
+ const { deployGithubCommand } = await import("./github-CEaFDL6t.mjs");
11449
11503
  await deployGithubCommand(options);
11450
11504
  } catch (error) {
11451
11505
  console.error(formatError(error));