@geekmidas/cli 10.0.0-alpha.87 → 10.0.0-alpha.89

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 (180) hide show
  1. package/dist/GoDaddyProvider--36rw8cP.mjs +387 -0
  2. package/dist/GoDaddyProvider--36rw8cP.mjs.map +1 -0
  3. package/dist/GoDaddyProvider-DnRor066.cjs +387 -0
  4. package/dist/GoDaddyProvider-DnRor066.cjs.map +1 -0
  5. package/dist/{HostingerProvider-CVc3rLPB.mjs → HostingerProvider-BI6J7oJr.mjs} +2 -2
  6. package/dist/{HostingerProvider-CVc3rLPB.mjs.map → HostingerProvider-BI6J7oJr.mjs.map} +1 -1
  7. package/dist/{HostingerProvider-BCB1QJj1.cjs → HostingerProvider-CyTpG_jy.cjs} +2 -2
  8. package/dist/{HostingerProvider-BCB1QJj1.cjs.map → HostingerProvider-CyTpG_jy.cjs.map} +1 -1
  9. package/dist/{LegacyStateStore-CWG_HVC0.cjs → LegacyStateStore-BaBoYl59.cjs} +2 -2
  10. package/dist/{LegacyStateStore-CWG_HVC0.cjs.map → LegacyStateStore-BaBoYl59.cjs.map} +1 -1
  11. package/dist/{LegacyStateStore-B0R4LlX_.mjs → LegacyStateStore-CO7bzJCU.mjs} +2 -2
  12. package/dist/{LegacyStateStore-B0R4LlX_.mjs.map → LegacyStateStore-CO7bzJCU.mjs.map} +1 -1
  13. package/dist/{LocalStateStore-CLwa2DpK.cjs → LocalStateStore-CUWh2BWU.cjs} +2 -2
  14. package/dist/{LocalStateStore-CLwa2DpK.cjs.map → LocalStateStore-CUWh2BWU.cjs.map} +1 -1
  15. package/dist/{LocalStateStore-Q4vXg2ua.mjs → LocalStateStore-C_hYDv6I.mjs} +2 -2
  16. package/dist/{LocalStateStore-Q4vXg2ua.mjs.map → LocalStateStore-C_hYDv6I.mjs.map} +1 -1
  17. package/dist/{S3StateStore-Cea9_5gF.cjs → S3StateStore-O8EYfjfG.cjs} +2 -2
  18. package/dist/{S3StateStore-Cea9_5gF.cjs.map → S3StateStore-O8EYfjfG.cjs.map} +1 -1
  19. package/dist/{S3StateStore-CksKYKRa.mjs → S3StateStore-hIm8Rrmu.mjs} +2 -2
  20. package/dist/{S3StateStore-CksKYKRa.mjs.map → S3StateStore-hIm8Rrmu.mjs.map} +1 -1
  21. package/dist/{SSMStateStore-aBOTF018.cjs → SSMStateStore-DIzbiqCz.cjs} +2 -2
  22. package/dist/{SSMStateStore-aBOTF018.cjs.map → SSMStateStore-DIzbiqCz.cjs.map} +1 -1
  23. package/dist/{SSMStateStore-BszSCAS2.mjs → SSMStateStore-IvcjTk8h.mjs} +2 -2
  24. package/dist/{SSMStateStore-BszSCAS2.mjs.map → SSMStateStore-IvcjTk8h.mjs.map} +1 -1
  25. package/dist/SubscriberGenerator-BPqQf8fB.mjs.map +1 -1
  26. package/dist/SubscriberGenerator-BVn7cQ-2.cjs.map +1 -1
  27. package/dist/{add-5MZAXybv.cjs → add-C9qX4Juc.cjs} +30 -7
  28. package/dist/add-C9qX4Juc.cjs.map +1 -0
  29. package/dist/{add-D_jNqnfZ.mjs → add-v3tCbrpE.mjs} +30 -7
  30. package/dist/add-v3tCbrpE.mjs.map +1 -0
  31. package/dist/{bundler-1REMhKps.cjs → bundler-C4NmpRTD.cjs} +5 -5
  32. package/dist/{bundler-1REMhKps.cjs.map → bundler-C4NmpRTD.cjs.map} +1 -1
  33. package/dist/{bundler-BMo-JP5s.mjs → bundler-C_fCgcVO.mjs} +5 -5
  34. package/dist/{bundler-BMo-JP5s.mjs.map → bundler-C_fCgcVO.mjs.map} +1 -1
  35. package/dist/{cli-BL8ZHsLQ.cjs → cli-C85Dut8K.cjs} +6 -5
  36. package/dist/cli-C85Dut8K.cjs.map +1 -0
  37. package/dist/{cli-7edNFwGk.mjs → cli-REdO9X5b.mjs} +7 -6
  38. package/dist/cli-REdO9X5b.mjs.map +1 -0
  39. package/dist/{compose-xw86kVYi.cjs → compose-BvrhDwJ6.cjs} +556 -30
  40. package/dist/compose-BvrhDwJ6.cjs.map +1 -0
  41. package/dist/{compose-DbJhRQlh.mjs → compose-Dn0oAgQ0.mjs} +509 -31
  42. package/dist/compose-Dn0oAgQ0.mjs.map +1 -0
  43. package/dist/{config-DrCAyoH5.d.mts → config-CdEcTrjG.d.mts} +3 -3
  44. package/dist/{config-CpjsVxru.d.cts.map → config-CdEcTrjG.d.mts.map} +1 -1
  45. package/dist/{config-CpjsVxru.d.cts → config-pST7E0CS.d.cts} +3 -3
  46. package/dist/{config-DrCAyoH5.d.mts.map → config-pST7E0CS.d.cts.map} +1 -1
  47. package/dist/config.cjs +1 -1
  48. package/dist/config.d.cts +3 -3
  49. package/dist/config.d.mts +3 -3
  50. package/dist/config.mjs +1 -1
  51. package/dist/{credentials-tr26-KML.cjs → credentials-BKfIugu2.cjs} +47 -2
  52. package/dist/credentials-BKfIugu2.cjs.map +1 -0
  53. package/dist/{credentials-BgJ5mS_d.mjs → credentials-CnVqoXMb.mjs} +30 -3
  54. package/dist/credentials-CnVqoXMb.mjs.map +1 -0
  55. package/dist/databases-BY-pEImp.cjs.map +1 -1
  56. package/dist/databases-CzszQV0N.mjs.map +1 -1
  57. package/dist/deploy/public.cjs +10 -10
  58. package/dist/deploy/public.d.cts +9 -3
  59. package/dist/deploy/public.d.cts.map +1 -1
  60. package/dist/deploy/public.d.mts +9 -3
  61. package/dist/deploy/public.d.mts.map +1 -1
  62. package/dist/deploy/public.mjs +10 -10
  63. package/dist/{deploy-BTfmXd3g.mjs → deploy-BaERRh0Q.mjs} +10 -8
  64. package/dist/deploy-BaERRh0Q.mjs.map +1 -0
  65. package/dist/{deploy-CtbZj4zN.cjs → deploy-DbBGo3a6.cjs} +10 -8
  66. package/dist/deploy-DbBGo3a6.cjs.map +1 -0
  67. package/dist/{dokploy-r69yZaIt.mjs → dokploy-CMmD_ddX.mjs} +2 -2
  68. package/dist/{dokploy-r69yZaIt.mjs.map → dokploy-CMmD_ddX.mjs.map} +1 -1
  69. package/dist/{dokploy-TGk3oPwr.cjs → dokploy-DwAaKA9B.cjs} +2 -2
  70. package/dist/{dokploy-TGk3oPwr.cjs.map → dokploy-DwAaKA9B.cjs.map} +1 -1
  71. package/dist/{encryption-C-8Tt5Hh.mjs → encryption-BQmhq9_y.mjs} +3 -3
  72. package/dist/{encryption-C-8Tt5Hh.mjs.map → encryption-BQmhq9_y.mjs.map} +1 -1
  73. package/dist/{encryption-CDn7BH5O.cjs → encryption-BrN_9_CM.cjs} +3 -3
  74. package/dist/{encryption-CDn7BH5O.cjs.map → encryption-BrN_9_CM.cjs.map} +1 -1
  75. package/dist/{engine-jAINgiOB.mjs → engine-DILocOOH.mjs} +23 -404
  76. package/dist/engine-DILocOOH.mjs.map +1 -0
  77. package/dist/{engine-Bt5k_UMq.cjs → engine-DgHoFBMw.cjs} +25 -406
  78. package/dist/engine-DgHoFBMw.cjs.map +1 -0
  79. package/dist/{github-DFhuJQlp.cjs → github-Bf7pz6AV.cjs} +3 -3
  80. package/dist/{github-DFhuJQlp.cjs.map → github-Bf7pz6AV.cjs.map} +1 -1
  81. package/dist/{github-CZHAtwPT.mjs → github-xzg99wz8.mjs} +3 -3
  82. package/dist/{github-CZHAtwPT.mjs.map → github-xzg99wz8.mjs.map} +1 -1
  83. package/dist/{index-MnUJuUlj.d.mts → index-D-F_hTDz.d.cts} +21 -4
  84. package/dist/index-D-F_hTDz.d.cts.map +1 -0
  85. package/dist/{index-elsLJTUv.d.cts → index-YFNxR5Ns.d.mts} +21 -4
  86. package/dist/index-YFNxR5Ns.d.mts.map +1 -0
  87. package/dist/index.cjs +305 -69
  88. package/dist/index.cjs.map +1 -1
  89. package/dist/index.mjs +306 -71
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/{local-Cq8qdgNX.cjs → local-BjxDfPvy.cjs} +2 -2
  92. package/dist/{local-Cq8qdgNX.cjs.map → local-BjxDfPvy.cjs.map} +1 -1
  93. package/dist/{local-Ciq-bTPr.mjs → local-IuoIF3CT.mjs} +2 -2
  94. package/dist/{local-Ciq-bTPr.mjs.map → local-IuoIF3CT.mjs.map} +1 -1
  95. package/dist/{migrate-B1rVlwj1.cjs → migrate-7xayVtzL.cjs} +3 -3
  96. package/dist/{migrate-B1rVlwj1.cjs.map → migrate-7xayVtzL.cjs.map} +1 -1
  97. package/dist/{migrate-ggkPVJRC.mjs → migrate-CKLJ73OO.mjs} +4 -4
  98. package/dist/{migrate-ggkPVJRC.mjs.map → migrate-CKLJ73OO.mjs.map} +1 -1
  99. package/dist/{migrate-Dn7nK6sh.mjs → migrate-CpmO5qnl.mjs} +3 -3
  100. package/dist/{migrate-Dn7nK6sh.mjs.map → migrate-CpmO5qnl.mjs.map} +1 -1
  101. package/dist/{migrate-B16qgYTn.cjs → migrate-DPF7ZF8M.cjs} +3 -3
  102. package/dist/{migrate-B16qgYTn.cjs.map → migrate-DPF7ZF8M.cjs.map} +1 -1
  103. package/dist/openapi.cjs +1 -1
  104. package/dist/openapi.d.cts +1 -1
  105. package/dist/openapi.d.mts +1 -1
  106. package/dist/openapi.mjs +1 -1
  107. package/dist/ready-BpNbORRB.cjs.map +1 -1
  108. package/dist/ready-b6vm0-W-.mjs.map +1 -1
  109. package/dist/reconcile/public.d.cts +1 -1
  110. package/dist/reconcile/public.d.mts +1 -1
  111. package/dist/{reconcile--I7V4Klj.mjs → reconcile-Dh1Jk7WE.mjs} +2 -2
  112. package/dist/{reconcile--I7V4Klj.mjs.map → reconcile-Dh1Jk7WE.mjs.map} +1 -1
  113. package/dist/{resolve-BSke45k6.mjs → resolve-Dv_weZoh.mjs} +4 -4
  114. package/dist/{resolve-BSke45k6.mjs.map → resolve-Dv_weZoh.mjs.map} +1 -1
  115. package/dist/{resolve-BXeXzpmU.cjs → resolve-dlKPFNgv.cjs} +4 -4
  116. package/dist/{resolve-BXeXzpmU.cjs.map → resolve-dlKPFNgv.cjs.map} +1 -1
  117. package/dist/{rollback-DFMiBWf0.cjs → rollback-65VVIdBM.cjs} +6 -6
  118. package/dist/{rollback-DFMiBWf0.cjs.map → rollback-65VVIdBM.cjs.map} +1 -1
  119. package/dist/{rollback-CEE6dse4.mjs → rollback-DpSU2DsD.mjs} +6 -6
  120. package/dist/{rollback-CEE6dse4.mjs.map → rollback-DpSU2DsD.mjs.map} +1 -1
  121. package/dist/{runtime-HabiNBtJ.d.mts → runtime-CN_kmqxo.d.cts} +2 -2
  122. package/dist/{runtime-D48ZKk8_.d.cts.map → runtime-CN_kmqxo.d.cts.map} +1 -1
  123. package/dist/{runtime-D48ZKk8_.d.cts → runtime-Cjvon3oj.d.mts} +2 -2
  124. package/dist/{runtime-HabiNBtJ.d.mts.map → runtime-Cjvon3oj.d.mts.map} +1 -1
  125. package/dist/{seeds-CsI0A_Ef.cjs → seeds-CN6tB-va.cjs} +646 -187
  126. package/dist/{seeds-CsI0A_Ef.cjs.map → seeds-CN6tB-va.cjs.map} +1 -1
  127. package/dist/{seeds-BYdrtZsC.mjs → seeds-perzdN81.mjs} +599 -164
  128. package/dist/seeds-perzdN81.mjs.map +1 -0
  129. package/dist/{sniffer-B0EU73bj.mjs → sniffer-BTtX3NUM.mjs} +3 -3
  130. package/dist/{sniffer-B0EU73bj.mjs.map → sniffer-BTtX3NUM.mjs.map} +1 -1
  131. package/dist/{sniffer-DJYupBeK.cjs → sniffer-IAQEpsQb.cjs} +3 -3
  132. package/dist/{sniffer-DJYupBeK.cjs.map → sniffer-IAQEpsQb.cjs.map} +1 -1
  133. package/dist/{sst-DAqUoZKG.cjs → sst-BgcOsaBi.cjs} +3 -3
  134. package/dist/{sst-DAqUoZKG.cjs.map → sst-BgcOsaBi.cjs.map} +1 -1
  135. package/dist/{sst-D1Qj4sIs.mjs → sst-CJzvyrEz.mjs} +3 -3
  136. package/dist/{sst-D1Qj4sIs.mjs.map → sst-CJzvyrEz.mjs.map} +1 -1
  137. package/dist/{stages-Brn3vcdy.cjs → stages-CUn6gvXL.cjs} +2 -2
  138. package/dist/{stages-Brn3vcdy.cjs.map → stages-CUn6gvXL.cjs.map} +1 -1
  139. package/dist/{stages-DoHHz6pS.mjs → stages-CnZRYmkI.mjs} +2 -2
  140. package/dist/{stages-DoHHz6pS.mjs.map → stages-CnZRYmkI.mjs.map} +1 -1
  141. package/dist/target/public.cjs +1 -1
  142. package/dist/target/public.d.cts +2 -2
  143. package/dist/target/public.d.mts +2 -2
  144. package/dist/target/public.mjs +1 -1
  145. package/dist/{terminal-BTbZlrFV.mjs → terminal-D8TPK7o9.mjs} +3 -3
  146. package/dist/{terminal-BTbZlrFV.mjs.map → terminal-D8TPK7o9.mjs.map} +1 -1
  147. package/dist/{terminal-COv23heb.cjs → terminal-DuapRxh6.cjs} +2 -2
  148. package/dist/{terminal-COv23heb.cjs.map → terminal-DuapRxh6.cjs.map} +1 -1
  149. package/dist/{types-0oAyFOfR.d.cts → types-NqX1Hz4P.d.cts} +210 -205
  150. package/dist/types-NqX1Hz4P.d.cts.map +1 -0
  151. package/dist/{types-BZ01tZs-.d.mts → types-ZHuZ89hv.d.mts} +210 -205
  152. package/dist/types-ZHuZ89hv.d.mts.map +1 -0
  153. package/dist/workspace/index.cjs +3 -1
  154. package/dist/workspace/index.d.cts +3 -3
  155. package/dist/workspace/index.d.mts +3 -3
  156. package/dist/workspace/index.mjs +2 -2
  157. package/dist/{workspace-D2CYLMCW.mjs → workspace-CJ0lKFq-.mjs} +231 -10
  158. package/dist/workspace-CJ0lKFq-.mjs.map +1 -0
  159. package/dist/{workspace-CT0JM3Y8.cjs → workspace-CwW3Gkru.cjs} +266 -9
  160. package/dist/workspace-CwW3Gkru.cjs.map +1 -0
  161. package/package.json +15 -15
  162. package/dist/add-5MZAXybv.cjs.map +0 -1
  163. package/dist/add-D_jNqnfZ.mjs.map +0 -1
  164. package/dist/cli-7edNFwGk.mjs.map +0 -1
  165. package/dist/cli-BL8ZHsLQ.cjs.map +0 -1
  166. package/dist/compose-DbJhRQlh.mjs.map +0 -1
  167. package/dist/compose-xw86kVYi.cjs.map +0 -1
  168. package/dist/credentials-BgJ5mS_d.mjs.map +0 -1
  169. package/dist/credentials-tr26-KML.cjs.map +0 -1
  170. package/dist/deploy-BTfmXd3g.mjs.map +0 -1
  171. package/dist/deploy-CtbZj4zN.cjs.map +0 -1
  172. package/dist/engine-Bt5k_UMq.cjs.map +0 -1
  173. package/dist/engine-jAINgiOB.mjs.map +0 -1
  174. package/dist/index-MnUJuUlj.d.mts.map +0 -1
  175. package/dist/index-elsLJTUv.d.cts.map +0 -1
  176. package/dist/seeds-BYdrtZsC.mjs.map +0 -1
  177. package/dist/types-0oAyFOfR.d.cts.map +0 -1
  178. package/dist/types-BZ01tZs-.d.mts.map +0 -1
  179. package/dist/workspace-CT0JM3Y8.cjs.map +0 -1
  180. package/dist/workspace-D2CYLMCW.mjs.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env -S npx tsx
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
4
- const require_credentials = require("./credentials-tr26-KML.cjs");
4
+ const require_credentials = require("./credentials-BKfIugu2.cjs");
5
5
  const require_discover = require("./discover-D1It5r_h.cjs");
6
6
  const require_derive = require("./derive-DAbo49sm.cjs");
7
- const require_workspace = require("./workspace-CT0JM3Y8.cjs");
7
+ const require_workspace = require("./workspace-CwW3Gkru.cjs");
8
8
  const require_config = require("./config.cjs");
9
- const require_seeds = require("./seeds-CsI0A_Ef.cjs");
9
+ const require_seeds = require("./seeds-CN6tB-va.cjs");
10
10
  const require_EndpointGenerator = require("./EndpointGenerator-CwLjBCFE.cjs");
11
11
  const require_openapi = require("./openapi.cjs");
12
12
  const require_SubscriberGenerator = require("./SubscriberGenerator-BVn7cQ-2.cjs");
13
13
  const require_appPorts = require("./appPorts-Cu79hJF6.cjs");
14
14
  const require_drivers = require("./drivers-LYSdQDmd.cjs");
15
15
  const require_emit = require("./emit-Dmc1nvdS.cjs");
16
- const require_local = require("./local-Cq8qdgNX.cjs");
17
- const require_sniffer = require("./sniffer-DJYupBeK.cjs");
18
- const require_deploy = require("./deploy-CtbZj4zN.cjs");
19
- const require_compose = require("./compose-xw86kVYi.cjs");
16
+ const require_local = require("./local-BjxDfPvy.cjs");
17
+ const require_sniffer = require("./sniffer-IAQEpsQb.cjs");
18
+ const require_deploy = require("./deploy-DbBGo3a6.cjs");
19
+ const require_compose = require("./compose-BvrhDwJ6.cjs");
20
20
  const require_credentialSchemas = require("./credentialSchemas-DCR4Wd1W.cjs");
21
- const require_LocalStateStore = require("./LocalStateStore-CLwa2DpK.cjs");
21
+ const require_LocalStateStore = require("./LocalStateStore-CUWh2BWU.cjs");
22
22
  const require_utils = require("./utils-D2Nk1Nv2.cjs");
23
23
  const require_ready = require("./ready-BpNbORRB.cjs");
24
24
  let node_path = require("node:path");
@@ -53,7 +53,7 @@ crypto = require_rolldown_runtime.__toESM(crypto, 1);
53
53
  let _geekmidas_constructs_functions = require("@geekmidas/constructs/functions");
54
54
  let _geekmidas_constructs_topic = require("@geekmidas/constructs/topic");
55
55
  //#region package.json
56
- var version = "10.0.0-alpha.87";
56
+ var version = "10.0.0-alpha.89";
57
57
  //#endregion
58
58
  //#region src/prompt.ts
59
59
  /**
@@ -136,7 +136,7 @@ const logger$8 = console;
136
136
  * Validate Dokploy token by making a test API call
137
137
  */
138
138
  async function validateDokployToken(endpoint, token) {
139
- const { DokployApi } = await Promise.resolve().then(() => require("./sniffer-DJYupBeK.cjs")).then((n) => n.dokploy_api_exports);
139
+ const { DokployApi } = await Promise.resolve().then(() => require("./sniffer-IAQEpsQb.cjs")).then((n) => n.dokploy_api_exports);
140
140
  return new DokployApi({
141
141
  baseUrl: endpoint,
142
142
  token
@@ -183,6 +183,10 @@ async function loginCommand(options) {
183
183
  logger$8.log(` Credentials stored in: ${require_credentials.getCredentialsPath()}`);
184
184
  logger$8.log("\nYou can now use deploy commands without setting DOKPLOY_API_TOKEN.");
185
185
  }
186
+ if (provider === "godaddy") {
187
+ await loginGoDaddy(options);
188
+ return;
189
+ }
186
190
  if (provider === "hostinger") {
187
191
  logger$8.log("\n🔐 Logging in to Hostinger...\n");
188
192
  let token = providedToken;
@@ -205,15 +209,50 @@ async function loginCommand(options) {
205
209
  }
206
210
  }
207
211
  /**
212
+ * Store a GoDaddy Personal Access Token. Not validated: the only call that
213
+ * proves a token without a domain is an account call (`GET /v1/domains`),
214
+ * which a token scoped to `domains.dns:update` alone may not make — the first
215
+ * `gkm setup` that writes a record is where a bad token reports itself.
216
+ */
217
+ async function loginGoDaddy(options) {
218
+ logger$8.log("\n🔐 Logging in to GoDaddy...\n");
219
+ let token = options.token;
220
+ if (!token) {
221
+ logger$8.log("\nCreate a Personal Access Token in the GoDaddy developer dashboard\n(https://developer.godaddy.com) with only the domains.dns:update scope.\n");
222
+ token = await prompt("Personal Access Token: ", {
223
+ hidden: true,
224
+ instead: LOGIN_INSTEAD
225
+ });
226
+ }
227
+ if (!token) {
228
+ logger$8.error("Token is required");
229
+ process.exit(1);
230
+ }
231
+ const where = options.home ? { home: options.home } : void 0;
232
+ await require_credentials.storeGoDaddyToken(token, where);
233
+ logger$8.log("\n✓ GoDaddy token stored.");
234
+ logger$8.log(` Token: ${maskToken(token)}`);
235
+ logger$8.log(` Credentials stored in: ${require_credentials.getCredentialsPath(where)}`);
236
+ logger$8.log(" Not validated here: proving a token without a domain needs an account\n scope a DNS-only token does not have, so the first gkm setup that\n writes a record is where a bad token reports itself.");
237
+ logger$8.log("\nYou can now use it as a DNS provider without setting GODADDY_API_TOKEN.");
238
+ }
239
+ /**
208
240
  * Logout from a service
209
241
  */
210
242
  async function logoutCommand(options) {
211
243
  const { provider = "dokploy" } = options;
212
244
  if (provider === "all") {
213
- if (await require_credentials.removeDokployCredentials()) logger$8.log("\n✓ Logged out from all services");
245
+ const dokployRemoved = await require_credentials.removeDokployCredentials();
246
+ const godaddyRemoved = await require_credentials.removeGoDaddyCredentials();
247
+ if (dokployRemoved || godaddyRemoved) logger$8.log("\n✓ Logged out from all services");
214
248
  else logger$8.log("\nNo stored credentials found");
215
249
  return;
216
250
  }
251
+ if (provider === "godaddy") {
252
+ const removed = await require_credentials.removeGoDaddyCredentials();
253
+ logger$8.log(removed ? "\n✓ Logged out from GoDaddy" : "\nNo GoDaddy credentials found");
254
+ return;
255
+ }
217
256
  if (provider === "dokploy") {
218
257
  if (await require_credentials.removeDokployCredentials()) logger$8.log("\n✓ Logged out from Dokploy");
219
258
  else logger$8.log("\nNo Dokploy credentials found");
@@ -230,6 +269,8 @@ async function whoamiCommand() {
230
269
  logger$8.log(` Endpoint: ${dokploy.endpoint}`);
231
270
  logger$8.log(` Token: ${maskToken(dokploy.token)}`);
232
271
  } else logger$8.log(" Dokploy: Not logged in");
272
+ const godaddy = (await require_credentials.readCredentials()).godaddy;
273
+ logger$8.log(godaddy ? ` GoDaddy:\n Token: ${maskToken(godaddy.token)}` : " GoDaddy: Not logged in");
233
274
  logger$8.log(`\n Credentials file: ${require_credentials.getCredentialsPath()}`);
234
275
  }
235
276
  /**
@@ -499,6 +540,54 @@ var UnsupportedPlatform = class extends Error {
499
540
  }
500
541
  };
501
542
  //#endregion
543
+ //#region src/workspace/stageTypes.ts
544
+ /**
545
+ * `.gkm/stages.d.ts`: the declared stages, as types application code can see.
546
+ *
547
+ * Constructs and app code cannot import `gkm.config.ts`, so the stage names it
548
+ * declares were plain strings everywhere else. This writes them into
549
+ * `@geekmidas/constructs`' `Stages` interface, which `LocalStage`,
550
+ * `DeployedStage` and `AnyStage` read — an `ExternalApi` url keyed `prodution`
551
+ * becomes a type error. Without the file those types are `string`.
552
+ *
553
+ * Written by `gkm dev`, `gkm build` and `gkm test --prepare`, beside the
554
+ * generated clients; a project's tsconfig `include`s it.
555
+ */
556
+ /** Where the declaration is written, relative to the workspace root. */
557
+ const STAGE_TYPES_FILE = ".gkm/stages.d.ts";
558
+ /** A union of string literal types: `'staging' | 'prod'`, or `never`. */
559
+ function union(names) {
560
+ return names.length ? names.map((name) => `'${name}'`).join(" | ") : "never";
561
+ }
562
+ /** The declaration for a stages block. */
563
+ function stageTypesDeclaration(stages) {
564
+ return `// Generated by gkm from the \`stages\` in gkm.config.ts — do not edit.
565
+ // \`gkm dev\`, \`gkm build\` and \`gkm test --prepare\` rewrite it.
566
+ export {};
567
+
568
+ declare module '@geekmidas/constructs' {
569
+ interface Stages {
570
+ local: ${union([stages.local])};
571
+ deployed: ${union(stages.deployed)};
572
+ }
573
+ }
574
+ `;
575
+ }
576
+ /**
577
+ * Write `.gkm/stages.d.ts` under the workspace root, and return its path — or
578
+ * nothing when there are no stages to write. Left untouched when unchanged, so
579
+ * an editor's watcher does not re-check the project on every start.
580
+ */
581
+ async function writeStageTypes(root, stages) {
582
+ if (!stages) return void 0;
583
+ const path = (0, node_path.join)(root, STAGE_TYPES_FILE);
584
+ const content = stageTypesDeclaration(stages);
585
+ if (await (0, node_fs_promises.readFile)(path, "utf8").catch(() => void 0) === content) return path;
586
+ await (0, node_fs_promises.mkdir)((0, node_path.join)(root, ".gkm"), { recursive: true });
587
+ await (0, node_fs_promises.writeFile)(path, content);
588
+ return path;
589
+ }
590
+ //#endregion
502
591
  //#region src/dev/credentials.ts
503
592
  /**
504
593
  * `gkm dev:credentials` — where to sign in to each local service, and as
@@ -1812,8 +1901,10 @@ async function devCommand(options) {
1812
1901
  if (!appConfig) {
1813
1902
  logger$5.log("🔎 Reading gkm.config.ts and the constructs");
1814
1903
  const { workspace: everything } = await require_config.loadWorkspaceConfig();
1904
+ await writeStageTypes(everything.root, everything.stages);
1815
1905
  return workspaceDevCommand(everything, options);
1816
1906
  }
1907
+ await writeStageTypes(appConfig.workspace.root, appConfig.workspace.stages);
1817
1908
  const config = appConfig.gkmConfig;
1818
1909
  const appRoot = appConfig.appRoot;
1819
1910
  const secretsRoot = appConfig.workspaceRoot;
@@ -2239,9 +2330,9 @@ async function workspaceDevCommand(configured, options) {
2239
2330
  for (const { id, port } of fakes) logger$5.log(`🎭 ${id} fake: http://localhost:${port}`);
2240
2331
  logger$5.log(options.migrate || options.seed ? "🗄️ Migrating the databases" : "🗄️ Checking for pending migrations");
2241
2332
  if (options.migrate || options.seed) {
2242
- const { prepareDevDatabases } = await Promise.resolve().then(() => require("./migrate-B1rVlwj1.cjs"));
2333
+ const { prepareDevDatabases } = await Promise.resolve().then(() => require("./migrate-7xayVtzL.cjs"));
2243
2334
  await prepareDevDatabases(workspace, reconciled.env, { seed: !!options.seed });
2244
- } else await Promise.resolve().then(() => require("./migrate-B1rVlwj1.cjs")).then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
2335
+ } else await Promise.resolve().then(() => require("./migrate-7xayVtzL.cjs")).then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
2245
2336
  logger$5.log(`⚠️ Could not check for pending migrations: ${error instanceof Error ? error.message : String(error)}`);
2246
2337
  });
2247
2338
  const appUrls = {};
@@ -3144,6 +3235,7 @@ var UnknownCacheBackend = class extends Error {
3144
3235
  };
3145
3236
  async function buildCommand(options) {
3146
3237
  const loadedConfig = await require_config.loadWorkspaceConfig();
3238
+ await writeStageTypes(loadedConfig.workspace.root, loadedConfig.workspace.stages);
3147
3239
  if (loadedConfig.type === "workspace") {
3148
3240
  const cwd = (0, node_path.resolve)(process.cwd());
3149
3241
  const workspaceRoot = (0, node_path.resolve)(loadedConfig.workspace.root);
@@ -3293,7 +3385,7 @@ async function buildApp(input) {
3293
3385
  ...production,
3294
3386
  ...telemetry ? { telemetry } : {}
3295
3387
  });
3296
- const { bundleServer } = await Promise.resolve().then(() => require("./bundler-1REMhKps.cjs"));
3388
+ const { bundleServer } = await Promise.resolve().then(() => require("./bundler-C4NmpRTD.cjs"));
3297
3389
  await bundleServer({
3298
3390
  entryPoint,
3299
3391
  outputDir: (0, node_path.join)(outputDir, "dist"),
@@ -3438,7 +3530,7 @@ async function buildWorkers(input) {
3438
3530
  });
3439
3531
  logger$4.log(`Generated worker ${worker.id}: ${crons.length} crons, ${queues.length} queues, ${subscribers.length} subscribers`);
3440
3532
  if (!input.bundle) continue;
3441
- const { bundleServer } = await Promise.resolve().then(() => require("./bundler-1REMhKps.cjs"));
3533
+ const { bundleServer } = await Promise.resolve().then(() => require("./bundler-C4NmpRTD.cjs"));
3442
3534
  const outfile = require_seeds.workerBundleName(worker.id);
3443
3535
  await bundleServer({
3444
3536
  entryPoint,
@@ -3524,7 +3616,7 @@ async function buildForTarget(target, context, appRoot, workspaceRoot, endpointG
3524
3616
  let masterKey;
3525
3617
  if (context.production?.bundle && !skipBundle) {
3526
3618
  logger$4.log(`\n📦 Bundling production server...`);
3527
- const { bundleServer } = await Promise.resolve().then(() => require("./bundler-1REMhKps.cjs"));
3619
+ const { bundleServer } = await Promise.resolve().then(() => require("./bundler-C4NmpRTD.cjs"));
3528
3620
  const allConstructs = [
3529
3621
  ...endpoints.map((e) => e.construct),
3530
3622
  ...functions.map((f) => f.construct),
@@ -3818,6 +3910,7 @@ async function composeCommand(options, deps = {}) {
3818
3910
  ...options.dryRun ? { dryRun: true } : {},
3819
3911
  ...options.push ? { buildOnly: true } : {},
3820
3912
  ...options.allowDevServices ? { allowDevServices: true } : {},
3913
+ ...options.skipDnsCheck ? { skipDnsCheck: true } : {},
3821
3914
  logger: {
3822
3915
  info: (message) => console.log(message),
3823
3916
  warn: (message) => console.warn(message),
@@ -5225,25 +5318,25 @@ function loadPackageJson() {
5225
5318
  * Run: pnpm --filter @geekmidas/cli sync-versions
5226
5319
  */
5227
5320
  const GEEKMIDAS_VERSIONS = {
5228
- "@geekmidas/audit": "~10.0.0-alpha.87",
5229
- "@geekmidas/auth": "~10.0.0-alpha.87",
5230
- "@geekmidas/cache": "~10.0.0-alpha.87",
5231
- "@geekmidas/client": "~10.0.0-alpha.87",
5232
- "@geekmidas/cloud": "~10.0.0-alpha.87",
5233
- "@geekmidas/constructs": "~10.0.0-alpha.87",
5234
- "@geekmidas/db": "~10.0.0-alpha.87",
5235
- "@geekmidas/emailkit": "~10.0.0-alpha.87",
5236
- "@geekmidas/envkit": "~10.0.0-alpha.87",
5237
- "@geekmidas/errors": "~10.0.0-alpha.87",
5238
- "@geekmidas/events": "~10.0.0-alpha.87",
5239
- "@geekmidas/logger": "~10.0.0-alpha.87",
5240
- "@geekmidas/manifest": "~10.0.0-alpha.87",
5241
- "@geekmidas/rate-limit": "~10.0.0-alpha.87",
5242
- "@geekmidas/schema": "~10.0.0-alpha.87",
5243
- "@geekmidas/services": "~10.0.0-alpha.87",
5244
- "@geekmidas/storage": "~10.0.0-alpha.87",
5245
- "@geekmidas/telescope": "~10.0.0-alpha.87",
5246
- "@geekmidas/testkit": "~10.0.0-alpha.87",
5321
+ "@geekmidas/audit": "~10.0.0-alpha.89",
5322
+ "@geekmidas/auth": "~10.0.0-alpha.89",
5323
+ "@geekmidas/cache": "~10.0.0-alpha.89",
5324
+ "@geekmidas/client": "~10.0.0-alpha.89",
5325
+ "@geekmidas/cloud": "~10.0.0-alpha.89",
5326
+ "@geekmidas/constructs": "~10.0.0-alpha.89",
5327
+ "@geekmidas/db": "~10.0.0-alpha.89",
5328
+ "@geekmidas/emailkit": "~10.0.0-alpha.89",
5329
+ "@geekmidas/envkit": "~10.0.0-alpha.89",
5330
+ "@geekmidas/errors": "~10.0.0-alpha.89",
5331
+ "@geekmidas/events": "~10.0.0-alpha.89",
5332
+ "@geekmidas/logger": "~10.0.0-alpha.89",
5333
+ "@geekmidas/manifest": "~10.0.0-alpha.89",
5334
+ "@geekmidas/rate-limit": "~10.0.0-alpha.89",
5335
+ "@geekmidas/schema": "~10.0.0-alpha.89",
5336
+ "@geekmidas/services": "~10.0.0-alpha.89",
5337
+ "@geekmidas/storage": "~10.0.0-alpha.89",
5338
+ "@geekmidas/telescope": "~10.0.0-alpha.89",
5339
+ "@geekmidas/testkit": "~10.0.0-alpha.89",
5247
5340
  "@geekmidas/cli": `~${loadPackageJson().version}`
5248
5341
  };
5249
5342
  //#endregion
@@ -5294,7 +5387,7 @@ function generateAuthAppFiles(options) {
5294
5387
  [`@${options.name}/*`]: ["../../packages/*/src"]
5295
5388
  }
5296
5389
  },
5297
- include: ["src/**/*.ts"],
5390
+ include: ["src/**/*.ts", "../../.gkm/stages.d.ts"],
5298
5391
  exclude: ["node_modules", "dist"]
5299
5392
  };
5300
5393
  return [
@@ -5405,7 +5498,7 @@ export default defineConfig({${stagesBlock(options.stages)}${options.monorepo ?
5405
5498
  gkmConfig += `
5406
5499
  });
5407
5500
  `;
5408
- const tsConfig = options.monorepo ? workspaceApiTsConfig(options.name) : {
5501
+ const tsConfig = options.monorepo ? workspaceApiTsConfig(options.name, ".gkm/stages.d.ts") : {
5409
5502
  compilerOptions: {
5410
5503
  target: "ES2022",
5411
5504
  module: "NodeNext",
@@ -5420,7 +5513,7 @@ export default defineConfig({${stagesBlock(options.stages)}${options.monorepo ?
5420
5513
  allowImportingTsExtensions: true,
5421
5514
  paths: { "~/*": ["./src/*"] }
5422
5515
  },
5423
- include: ["src/**/*.ts"],
5516
+ include: ["src/**/*.ts", ".gkm/stages.d.ts"],
5424
5517
  exclude: ["node_modules", "dist"]
5425
5518
  };
5426
5519
  if (options.monorepo) {
@@ -5535,7 +5628,7 @@ export default defineConfig({${stagesBlock(options.stages)}${options.monorepo ?
5535
5628
  * the root constructs, so in the other `@<name>/constructs/api.ts` fell through
5536
5629
  * to the `packages/` mapping and nothing could load the surface.
5537
5630
  */
5538
- function workspaceApiTsConfig(name) {
5631
+ function workspaceApiTsConfig(name, stageTypes) {
5539
5632
  return {
5540
5633
  extends: "../../tsconfig.json",
5541
5634
  compilerOptions: {
@@ -5547,12 +5640,12 @@ function workspaceApiTsConfig(name) {
5547
5640
  [`@${name}/*`]: ["../../packages/*/src"]
5548
5641
  }
5549
5642
  },
5550
- include: ["src/**/*.ts"],
5643
+ include: ["src/**/*.ts", stageTypes],
5551
5644
  exclude: ["node_modules", "dist"]
5552
5645
  };
5553
5646
  }
5554
5647
  function generateSingleAppConfigFiles(options, _template, _helpers) {
5555
- const tsConfig = workspaceApiTsConfig(options.name);
5648
+ const tsConfig = workspaceApiTsConfig(options.name, "../../.gkm/stages.d.ts");
5556
5649
  const files = [{
5557
5650
  path: "tsconfig.json",
5558
5651
  content: `${JSON.stringify(tsConfig, null, 2)}\n`
@@ -5644,7 +5737,7 @@ const COMMIT = /^[0-9a-f]{40}$/;
5644
5737
  * The `uses:` value for the stages action, with a comment saying which CLI
5645
5738
  * release the pinned commit is.
5646
5739
  */
5647
- function stagesActionUses(commit = "8bf34e377e5def9821eacaea3971d6daf6c91748", version = cliVersion()) {
5740
+ function stagesActionUses(commit = "e1be097c3e5909843479a2dcd97f06e952f5b1aa", version = cliVersion()) {
5648
5741
  return commit && COMMIT.test(commit) ? `${STAGES_ACTION}@${commit} # @geekmidas/cli ${version}` : `${STAGES_ACTION}@main # pin to a commit SHA: see the action's README`;
5649
5742
  }
5650
5743
  //#endregion
@@ -7404,6 +7497,7 @@ ${isSst ? "\n# SST\n.sst/\n" : ""}`;
7404
7497
  forceConsistentCasingInFileNames: true,
7405
7498
  resolveJsonModule: true
7406
7499
  },
7500
+ include: ["**/*", ".gkm/stages.d.ts"],
7407
7501
  exclude: [
7408
7502
  "node_modules",
7409
7503
  "dist",
@@ -10925,6 +11019,135 @@ function maskUrl(url) {
10925
11019
  }
10926
11020
  }
10927
11021
  //#endregion
11022
+ //#region src/providers/dns.ts
11023
+ /** Whether the workspace deploys through the compose target. */
11024
+ function deploysWithCompose(workspace) {
11025
+ return workspace.deploy?.default === "compose" || Object.values(workspace.apps).some((app) => app.resolvedDeployTarget === "compose");
11026
+ }
11027
+ /**
11028
+ * A compose stage that serves a domain has its server's address in its
11029
+ * secrets — checked before `gkm setup --stage` does anything else.
11030
+ *
11031
+ * @throws {ServerAddressMissing} for a compose stage with a domain and none
11032
+ * @throws {ServerAddressInvalid} for a value that is not an address
11033
+ */
11034
+ function assertStageServer(workspace, stage, secrets) {
11035
+ if (stage === workspace.stages.local) return void 0;
11036
+ if (!deploysWithCompose(workspace)) return require_compose.serverAddress(stage, secrets?.custom);
11037
+ return require_compose.requiredServerAddress(stage, workspace.domains?.[stage], secrets?.custom);
11038
+ }
11039
+ /**
11040
+ * The hosts a compose stage serves: its stack composed as a deploy would —
11041
+ * with the secrets it would generate made up in memory, never written — and
11042
+ * every route's host read off it.
11043
+ */
11044
+ async function composeStageHosts(options) {
11045
+ const { workspace, stage } = options;
11046
+ const runnables = options.runnables ?? {};
11047
+ const background = options.background ?? {};
11048
+ const manifest = options.manifest ?? await require_discover.discover({
11049
+ patterns: require_seeds.constructGlobs(workspace),
11050
+ cwd: workspace.root,
11051
+ runnables,
11052
+ background
11053
+ });
11054
+ const stored = await (await require_seeds.secretsStoreFor(workspace, stage, {
11055
+ ...options.profile ? { profile: options.profile } : {},
11056
+ ...options.home ? { home: options.home } : {}
11057
+ })).read(stage);
11058
+ const { deployedStackSecrets } = await Promise.resolve().then(() => require("./compose-BvrhDwJ6.cjs")).then((n) => n.secrets_exports);
11059
+ const { composeStack } = await Promise.resolve().then(() => require("./compose-BvrhDwJ6.cjs")).then((n) => n.stack_exports);
11060
+ const { secrets } = deployedStackSecrets(workspace, stage, stored, manifest);
11061
+ const stack = composeStack({
11062
+ workspace,
11063
+ manifest,
11064
+ runnables,
11065
+ background,
11066
+ stage,
11067
+ identity: require_seeds.deployIdentity(workspace, stage),
11068
+ images: {
11069
+ mode: "pull",
11070
+ tag: "dns",
11071
+ ...workspace.deploy?.registry ? { registry: workspace.deploy.registry } : {}
11072
+ },
11073
+ secrets,
11074
+ buildOnly: true,
11075
+ allowDevServices: true
11076
+ });
11077
+ return require_compose.stackHosts(stack);
11078
+ }
11079
+ /**
11080
+ * `GKM_SERVER_IPV4` from the stage's secrets and `dns`: each public host's
11081
+ * records, created or corrected. A dry run reads and prints, and writes
11082
+ * nothing.
11083
+ */
11084
+ async function provisionStageDns(options) {
11085
+ const { workspace, stage } = options;
11086
+ const log = options.log ?? ((line) => console.log(line));
11087
+ if (stage === workspace.stages.local || !workspace.dns || !deploysWithCompose(workspace)) return {
11088
+ mode: "none",
11089
+ hosts: [],
11090
+ changes: []
11091
+ };
11092
+ const store = await require_seeds.secretsStoreFor(workspace, stage, {
11093
+ ...options.profile ? { profile: options.profile } : {},
11094
+ ...options.home ? { home: options.home } : {}
11095
+ });
11096
+ const server = require_compose.serverAddress(stage, (await store.read(stage))?.custom);
11097
+ if (!server) {
11098
+ log(`\n🌐 DNS for '${stage}': no GKM_SERVER_IPV4 in its secrets, so no records — ${require_compose.serverAddressHint(stage)}`);
11099
+ return {
11100
+ mode: "none",
11101
+ hosts: [],
11102
+ changes: []
11103
+ };
11104
+ }
11105
+ const hosts = [...options.hosts ?? await composeStageHosts({
11106
+ workspace,
11107
+ stage,
11108
+ ...options.profile ? { profile: options.profile } : {},
11109
+ ...options.home ? { home: options.home } : {},
11110
+ ...options.manifest ? { manifest: options.manifest } : {},
11111
+ ...options.runnables ? { runnables: options.runnables } : {},
11112
+ ...options.background ? { background: options.background } : {}
11113
+ })];
11114
+ log(`\n🌐 DNS for '${stage}' → ${server.ipv4}${server.ipv6 ? ` / ${server.ipv6}` : ""}${options.dryRun ? " (dry run — nothing is written)" : ""}`);
11115
+ const plan = require_compose.planStackDns({
11116
+ stage,
11117
+ hosts,
11118
+ server,
11119
+ dns: workspace.dns
11120
+ });
11121
+ try {
11122
+ return {
11123
+ mode: "records",
11124
+ hosts,
11125
+ changes: await require_compose.applyStackDns(plan, {
11126
+ ...options.dryRun ? { dryRun: true } : {},
11127
+ log,
11128
+ credentials: {
11129
+ env: options.env ?? process.env,
11130
+ ...options.home ? { home: options.home } : {},
11131
+ log
11132
+ },
11133
+ ...options.providerFor ? { providerFor: options.providerFor } : {}
11134
+ })
11135
+ };
11136
+ } catch (error) {
11137
+ if (error instanceof require_credentials.MissingCredential) {
11138
+ log(` ⚠ ${error.message}`);
11139
+ log(" Until then, create these records yourself:");
11140
+ for (const domain of plan.domains) for (const r of domain.records) log(` ${r.host.padEnd(32)} ${r.type.padEnd(5)} ${r.value} (TTL ${r.ttl})`);
11141
+ return {
11142
+ mode: "records",
11143
+ hosts,
11144
+ changes: []
11145
+ };
11146
+ }
11147
+ throw error;
11148
+ }
11149
+ }
11150
+ //#endregion
10928
11151
  //#region src/setup/index.ts
10929
11152
  var setup_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
10930
11153
  createFreshWorkspaceSecrets: () => createFreshWorkspaceSecrets,
@@ -10958,6 +11181,7 @@ async function setupCommand(options = {}) {
10958
11181
  logger$1.log(`📦 Workspace: ${workspace.name}`);
10959
11182
  logger$1.log(`📱 Apps: ${Object.keys(workspace.apps).join(", ")}`);
10960
11183
  logger$1.log(`🔑 Stage: ${stage}\n`);
11184
+ if (!local) assertStageServer(workspace, stage, await (await require_seeds.secretsStoreFor(workspace, stage, { ...options.profile ? { profile: options.profile } : {} })).read(stage));
10961
11185
  if (!local && options.dryRun) {
10962
11186
  await provisionDeployed(workspace, stage, options);
10963
11187
  return;
@@ -10991,11 +11215,16 @@ async function provisionDeployed(workspace, stage, options) {
10991
11215
  ...options.retireOldKeys ? { retireOldKeys: true } : {},
10992
11216
  log: (line) => logger$1.log(line)
10993
11217
  })).filter((r) => r.mode === "provider");
10994
- if (configured.length === 0) {
10995
- logger$1.log(` None configured: '${stage}' takes every key from its secrets (gkm secrets:add --stage ${stage}). Name one in gkm.config.ts — deploy: { objects: { ${stage}: { provider: 's3' } } } — to have ${require_seeds.provisionCommand(stage)} create it.`);
10996
- return;
10997
- }
10998
- const changes = configured.reduce((n, r) => n + r.actions.length, 0);
11218
+ if (configured.length === 0) logger$1.log(` None configured: '${stage}' takes every key from its secrets (gkm secrets:add --stage ${stage}). Name one in gkm.config.ts — deploy: { objects: { ${stage}: { provider: 's3' } } } — to have ${require_seeds.provisionCommand(stage)} create it.`);
11219
+ const dns = await provisionStageDns({
11220
+ workspace,
11221
+ stage,
11222
+ ...options.dryRun ? { dryRun: true } : {},
11223
+ ...options.profile ? { profile: options.profile } : {},
11224
+ log: (line) => logger$1.log(line)
11225
+ });
11226
+ const changes = configured.reduce((n, r) => n + r.actions.length, 0) + dns.changes.filter((c) => c.action !== "unchanged" && c.action !== "manual").length;
11227
+ if (configured.length === 0 && dns.mode === "none") return;
10999
11228
  logger$1.log(options.dryRun ? `\n${changes === 0 ? "✅ Nothing to change" : `📋 ${changes} change${changes === 1 ? "" : "s"} planned`}` : `\n✅ '${stage}' provisioned${changes === 0 ? " — already up to date" : ` (${changes} change${changes === 1 ? "" : "s"})`}`);
11000
11229
  }
11001
11230
  /**
@@ -11266,6 +11495,7 @@ async function testCommand(options = {}) {
11266
11495
  const preloadPath = (0, node_path.join)(gkmDir, "test-credentials-preload.ts");
11267
11496
  await require_seeds.createCredentialsPreload(preloadPath, result.secretsJsonPath);
11268
11497
  const workspace = await require_config.loadWorkspaceConfig(cwd).then((loaded) => loaded.workspace).catch(() => void 0);
11498
+ if (workspace) await writeStageTypes(workspace.root, workspace.stages);
11269
11499
  const manifestPath = workspace ? await require_ready.writeTestHarness({
11270
11500
  root: workspace.root,
11271
11501
  targets: [workspace.root, ...Object.values(workspace.apps).map((app) => (0, node_path.isAbsolute)(app.path) ? app.path : (0, node_path.join)(workspace.root, app.path))],
@@ -11349,7 +11579,7 @@ function testDatabases(reconciled) {
11349
11579
  * starts without the reference data the app needs.
11350
11580
  */
11351
11581
  async function migrateTestStage(workspace, env) {
11352
- const { migrateAndSeed } = await Promise.resolve().then(() => require("./migrate-B1rVlwj1.cjs"));
11582
+ const { migrateAndSeed } = await Promise.resolve().then(() => require("./migrate-7xayVtzL.cjs"));
11353
11583
  const { discover } = await Promise.resolve().then(() => require("./discover-D1It5r_h.cjs")).then((n) => n.discover_exports);
11354
11584
  const sources = {};
11355
11585
  const manifest = await discover({
@@ -11793,7 +12023,7 @@ program.command("migrate").description("Apply each database construct's migratio
11793
12023
  try {
11794
12024
  const globalOptions = program.opts();
11795
12025
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11796
- const { migrateCommand } = await Promise.resolve().then(() => require("./migrate-B1rVlwj1.cjs"));
12026
+ const { migrateCommand } = await Promise.resolve().then(() => require("./migrate-7xayVtzL.cjs"));
11797
12027
  await migrateCommand({
11798
12028
  ...options,
11799
12029
  ...construct ? { construct } : {}
@@ -11807,7 +12037,7 @@ program.command("seed").description("Migrate, then run each database construct's
11807
12037
  try {
11808
12038
  const globalOptions = program.opts();
11809
12039
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11810
- const { seedCommand } = await Promise.resolve().then(() => require("./migrate-B1rVlwj1.cjs"));
12040
+ const { seedCommand } = await Promise.resolve().then(() => require("./migrate-7xayVtzL.cjs"));
11811
12041
  await seedCommand({
11812
12042
  ...options,
11813
12043
  ...construct ? { construct } : {}
@@ -11821,7 +12051,7 @@ program.command("migration").description("Write a construct's next migration: an
11821
12051
  try {
11822
12052
  const globalOptions = program.opts();
11823
12053
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11824
- const { migrationCommand } = await Promise.resolve().then(() => require("./migrate-B1rVlwj1.cjs"));
12054
+ const { migrationCommand } = await Promise.resolve().then(() => require("./migrate-7xayVtzL.cjs"));
11825
12055
  await migrationCommand({
11826
12056
  construct,
11827
12057
  ...name ? { name } : {}
@@ -11870,7 +12100,7 @@ program.command("docker").description("Generate Docker deployment files").option
11870
12100
  process.exit(1);
11871
12101
  }
11872
12102
  });
11873
- 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", "Deployed stage: run the dev service (MinIO, Mailpit) for every bucket and mail the stage doesn't account for. Not production-grade").action(async (options) => {
12103
+ 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", "Deployed stage: run the dev service (MinIO, Mailpit) for every bucket and mail the stage doesn't account for. Not production-grade").option("--skip-dns-check", "Deployed stage: do not check that each public host resolves to GKM_SERVER_IPV4 in the stage secrets before starting (a CDN or proxy in front)").action(async (options) => {
11874
12104
  try {
11875
12105
  const globalOptions = program.opts();
11876
12106
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
@@ -11929,7 +12159,7 @@ program.command("secrets:add").description("Build the keys a stage must be given
11929
12159
  try {
11930
12160
  const globalOptions = program.opts();
11931
12161
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11932
- const { secretsAddCommand } = await Promise.resolve().then(() => require("./add-5MZAXybv.cjs"));
12162
+ const { secretsAddCommand } = await Promise.resolve().then(() => require("./add-C9qX4Juc.cjs"));
11933
12163
  await secretsAddCommand(options);
11934
12164
  } catch (error) {
11935
12165
  console.error(formatError(error));
@@ -11940,7 +12170,7 @@ program.command("encryption:rotate").description("Add a new current key to an En
11940
12170
  try {
11941
12171
  const globalOptions = program.opts();
11942
12172
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11943
- const { encryptionRotateCommand } = await Promise.resolve().then(() => require("./encryption-CDn7BH5O.cjs"));
12173
+ const { encryptionRotateCommand } = await Promise.resolve().then(() => require("./encryption-BrN_9_CM.cjs"));
11944
12174
  await encryptionRotateCommand(construct, options);
11945
12175
  } catch (error) {
11946
12176
  console.error(formatError(error));
@@ -11951,7 +12181,7 @@ program.command("encryption:retire").description("Remove an old key from an Encr
11951
12181
  try {
11952
12182
  const globalOptions = program.opts();
11953
12183
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11954
- const { encryptionRetireCommand } = await Promise.resolve().then(() => require("./encryption-CDn7BH5O.cjs"));
12184
+ const { encryptionRetireCommand } = await Promise.resolve().then(() => require("./encryption-BrN_9_CM.cjs"));
11955
12185
  await encryptionRetireCommand(construct, key, options);
11956
12186
  } catch (error) {
11957
12187
  console.error(formatError(error));
@@ -11994,7 +12224,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
11994
12224
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11995
12225
  const { loadWorkspaceConfig } = await Promise.resolve().then(() => require("./config.cjs"));
11996
12226
  const { reconcileMissingSecrets } = await Promise.resolve().then(() => require("./reconcile-CuCQBa5-.cjs"));
11997
- const { secretsStoreFor } = await Promise.resolve().then(() => require("./seeds-CsI0A_Ef.cjs")).then((n) => n.store_exports);
12227
+ const { secretsStoreFor } = await Promise.resolve().then(() => require("./seeds-CN6tB-va.cjs")).then((n) => n.store_exports);
11998
12228
  const { workspace } = await loadWorkspaceConfig();
11999
12229
  const stage = options.stage ?? workspace.stages.local;
12000
12230
  const store = await secretsStoreFor(workspace, stage);
@@ -12003,7 +12233,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
12003
12233
  console.error(`No secrets found for stage "${stage}". Run "gkm secrets:init --stage ${stage}" first.`);
12004
12234
  process.exit(1);
12005
12235
  }
12006
- const { derivedContainers } = await Promise.resolve().then(() => require("./seeds-CsI0A_Ef.cjs")).then((n) => n.workspace_exports);
12236
+ const { derivedContainers } = await Promise.resolve().then(() => require("./seeds-CN6tB-va.cjs")).then((n) => n.workspace_exports);
12007
12237
  const result = reconcileMissingSecrets(secrets, workspace, await derivedContainers(workspace, stage));
12008
12238
  if (!result) {
12009
12239
  console.log(`\n✓ Secrets for stage "${stage}" are up-to-date`);
@@ -12021,15 +12251,15 @@ program.command("secrets:migrate").description("Copy a deployed stage's secrets
12021
12251
  try {
12022
12252
  const globalOptions = program.opts();
12023
12253
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12024
- const { secretsMigrateCommand } = await Promise.resolve().then(() => require("./migrate-B16qgYTn.cjs"));
12254
+ const { secretsMigrateCommand } = await Promise.resolve().then(() => require("./migrate-DPF7ZF8M.cjs"));
12025
12255
  await secretsMigrateCommand(options);
12026
12256
  } catch (error) {
12027
12257
  console.error(formatError(error));
12028
12258
  process.exit(1);
12029
12259
  }
12030
12260
  });
12031
- 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", "Server targets: run the dev service (MinIO, Mailpit) for every bucket and mail the stage doesn't account for. Not production-grade").action(async (options) => {
12032
- const { deployCli } = await Promise.resolve().then(() => require("./cli-BL8ZHsLQ.cjs"));
12261
+ 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", "Server targets: run the dev service (MinIO, Mailpit) for every bucket and mail the stage doesn't account for. Not production-grade").option("--skip-dns-check", "Compose: do not check that each public host resolves to GKM_SERVER_IPV4 in the stage secrets before starting (a CDN or proxy in front)").action(async (options) => {
12262
+ const { deployCli } = await Promise.resolve().then(() => require("./cli-C85Dut8K.cjs"));
12033
12263
  const globalOptions = program.opts();
12034
12264
  const code = await deployCli({
12035
12265
  cwd: (0, node_path.resolve)(globalOptions.cwd ?? process.cwd()),
@@ -12040,14 +12270,15 @@ program.command("deploy").description("Deploy a stage through its target").optio
12040
12270
  ...options.json ? { json: true } : {},
12041
12271
  ...options.dryRun ? { dryRun: true } : {},
12042
12272
  ...options.atomic ? { atomic: true } : {},
12043
- ...options.allowDevServices ? { allowDevServices: true } : {}
12273
+ ...options.allowDevServices ? { allowDevServices: true } : {},
12274
+ ...options.skipDnsCheck ? { skipDnsCheck: true } : {}
12044
12275
  });
12045
12276
  if (code !== 0) process.exit(code);
12046
12277
  });
12047
12278
  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) => {
12048
12279
  try {
12049
- const { rollbackStage } = await Promise.resolve().then(() => require("./rollback-DFMiBWf0.cjs")).then((n) => n.rollback_exports);
12050
- const { terminalCredentials } = await Promise.resolve().then(() => require("./terminal-COv23heb.cjs"));
12280
+ const { rollbackStage } = await Promise.resolve().then(() => require("./rollback-65VVIdBM.cjs")).then((n) => n.rollback_exports);
12281
+ const { terminalCredentials } = await Promise.resolve().then(() => require("./terminal-DuapRxh6.cjs"));
12051
12282
  const globalOptions = program.opts();
12052
12283
  await rollbackStage({
12053
12284
  cwd: (0, node_path.resolve)(globalOptions.cwd ?? process.cwd()),
@@ -12082,7 +12313,7 @@ program.command("deploy:github").description("Let GitHub Actions deploy a stage:
12082
12313
  try {
12083
12314
  const globalOptions = program.opts();
12084
12315
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12085
- const { deployGithubCommand } = await Promise.resolve().then(() => require("./github-DFhuJQlp.cjs"));
12316
+ const { deployGithubCommand } = await Promise.resolve().then(() => require("./github-Bf7pz6AV.cjs"));
12086
12317
  await deployGithubCommand(options);
12087
12318
  } catch (error) {
12088
12319
  console.error(formatError(error));
@@ -12093,7 +12324,7 @@ program.command("stages").description("The workspace's stages from gkm.config.ts
12093
12324
  try {
12094
12325
  const globalOptions = program.opts();
12095
12326
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12096
- const { stagesCommand } = await Promise.resolve().then(() => require("./stages-Brn3vcdy.cjs"));
12327
+ const { stagesCommand } = await Promise.resolve().then(() => require("./stages-CUn6gvXL.cjs"));
12097
12328
  await stagesCommand(options);
12098
12329
  } catch (error) {
12099
12330
  console.error(formatError(error));
@@ -12127,13 +12358,17 @@ program.command("deploy:list").description("List Dokploy resources (projects, re
12127
12358
  process.exit(1);
12128
12359
  }
12129
12360
  });
12130
- program.command("login").description("Authenticate with a deployment or DNS provider").option("--provider <provider>", "Provider to log in to (dokploy, hostinger)", "dokploy").option("--service <provider>", "[DEPRECATED] Use --provider instead").option("--token <token>", "API token (will prompt if not provided)").option("--endpoint <url>", "Service endpoint URL").action(async (options) => {
12361
+ program.command("login").description("Authenticate with a deployment or DNS provider").option("--provider <provider>", "Provider to log in to (dokploy, hostinger, godaddy)", "dokploy").option("--service <provider>", "[DEPRECATED] Use --provider instead").option("--token <token>", "API token (will prompt if not provided)").option("--endpoint <url>", "Service endpoint URL").action(async (options) => {
12131
12362
  try {
12132
12363
  const globalOptions = program.opts();
12133
12364
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12134
12365
  const provider = options.service ?? options.provider;
12135
- if (!["dokploy", "hostinger"].includes(provider)) {
12136
- console.error(`Unknown provider: ${provider}. Supported: dokploy, hostinger`);
12366
+ if (![
12367
+ "dokploy",
12368
+ "hostinger",
12369
+ "godaddy"
12370
+ ].includes(provider)) {
12371
+ console.error(`Unknown provider: ${provider}. Supported: dokploy, hostinger, godaddy`);
12137
12372
  process.exit(1);
12138
12373
  }
12139
12374
  await loginCommand({
@@ -12146,7 +12381,7 @@ program.command("login").description("Authenticate with a deployment or DNS prov
12146
12381
  process.exit(1);
12147
12382
  }
12148
12383
  });
12149
- program.command("logout").description("Remove stored credentials").option("--provider <provider>", "Whose credentials to remove (dokploy, all)", "dokploy").option("--service <provider>", "[DEPRECATED] Use --provider instead").action(async (options) => {
12384
+ program.command("logout").description("Remove stored credentials").option("--provider <provider>", "Whose credentials to remove (dokploy, godaddy, all)", "dokploy").option("--service <provider>", "[DEPRECATED] Use --provider instead").action(async (options) => {
12150
12385
  try {
12151
12386
  const globalOptions = program.opts();
12152
12387
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
@@ -12235,6 +12470,7 @@ try {
12235
12470
  program.parse();
12236
12471
  //#endregion
12237
12472
  exports.canPrompt = canPrompt;
12473
+ exports.deploysWithCompose = deploysWithCompose;
12238
12474
  exports.formatError = formatError;
12239
12475
  exports.generateFullstackCustomSecrets = generateFullstackCustomSecrets;
12240
12476
  exports.prompt = prompt;