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

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 (99) hide show
  1. package/dist/{add-j2yI3cbS.cjs → add-DCsgtvDk.cjs} +7 -7
  2. package/dist/{add-j2yI3cbS.cjs.map → add-DCsgtvDk.cjs.map} +1 -1
  3. package/dist/{add-B7IMXzou.mjs → add-EPQO-_dt.mjs} +2 -2
  4. package/dist/{add-B7IMXzou.mjs.map → add-EPQO-_dt.mjs.map} +1 -1
  5. package/dist/{bundler-Cf6OgaOe.cjs → bundler-5spPyduN.cjs} +3 -3
  6. package/dist/{bundler-Cf6OgaOe.cjs.map → bundler-5spPyduN.cjs.map} +1 -1
  7. package/dist/{bundler-DO6bHhnb.mjs → bundler-DgO_EMVs.mjs} +3 -3
  8. package/dist/{bundler-DO6bHhnb.mjs.map → bundler-DgO_EMVs.mjs.map} +1 -1
  9. package/dist/{cli-BCPOHmg9.mjs → cli-B74Ru-V1.mjs} +3 -3
  10. package/dist/{cli-BCPOHmg9.mjs.map → cli-B74Ru-V1.mjs.map} +1 -1
  11. package/dist/{cli-CNanUB7a.cjs → cli-ZpFTMbGw.cjs} +4 -4
  12. package/dist/{cli-CNanUB7a.cjs.map → cli-ZpFTMbGw.cjs.map} +1 -1
  13. package/dist/{compose-h_6oNnHC.cjs → compose-CePlrbUw.cjs} +66 -59
  14. package/dist/{compose-h_6oNnHC.cjs.map → compose-CePlrbUw.cjs.map} +1 -1
  15. package/dist/{compose-Dq4VCtu5.mjs → compose-IUuxRW0J.mjs} +16 -9
  16. package/dist/{compose-Dq4VCtu5.mjs.map → compose-IUuxRW0J.mjs.map} +1 -1
  17. package/dist/{config-CqAvPP-f.d.mts → config-Ckmoj56i.d.mts} +3 -3
  18. package/dist/{config-CWyhLSY1.d.cts.map → config-Ckmoj56i.d.mts.map} +1 -1
  19. package/dist/{config-CWyhLSY1.d.cts → config-aAeLXH86.d.cts} +3 -3
  20. package/dist/{config-CqAvPP-f.d.mts.map → config-aAeLXH86.d.cts.map} +1 -1
  21. package/dist/config.d.cts +3 -3
  22. package/dist/config.d.mts +3 -3
  23. package/dist/deploy/public.cjs +11 -11
  24. package/dist/deploy/public.d.cts +3 -3
  25. package/dist/deploy/public.d.cts.map +1 -1
  26. package/dist/deploy/public.d.mts +3 -3
  27. package/dist/deploy/public.d.mts.map +1 -1
  28. package/dist/deploy/public.mjs +5 -5
  29. package/dist/{deploy-CVXEx7Nm.mjs → deploy-Q6X6RXRG.mjs} +3 -3
  30. package/dist/{deploy-CVXEx7Nm.mjs.map → deploy-Q6X6RXRG.mjs.map} +1 -1
  31. package/dist/{deploy-CT3R9de9.cjs → deploy-XHXi-_tL.cjs} +9 -9
  32. package/dist/{deploy-CT3R9de9.cjs.map → deploy-XHXi-_tL.cjs.map} +1 -1
  33. package/dist/{dokploy-CYm2ozFs.mjs → dokploy-BtP5XSrS.mjs} +2 -2
  34. package/dist/{dokploy-CYm2ozFs.mjs.map → dokploy-BtP5XSrS.mjs.map} +1 -1
  35. package/dist/{dokploy-eSGmlhhj.cjs → dokploy-MSsPBO-t.cjs} +2 -2
  36. package/dist/{dokploy-eSGmlhhj.cjs.map → dokploy-MSsPBO-t.cjs.map} +1 -1
  37. package/dist/{encryption-DC0rsR1W.mjs → encryption-D4Ykywfr.mjs} +2 -2
  38. package/dist/{encryption-DC0rsR1W.mjs.map → encryption-D4Ykywfr.mjs.map} +1 -1
  39. package/dist/{encryption-vS3Qzw73.cjs → encryption-DY0na43R.cjs} +5 -5
  40. package/dist/{encryption-vS3Qzw73.cjs.map → encryption-DY0na43R.cjs.map} +1 -1
  41. package/dist/{engine-BOO5TWZd.mjs → engine-BI2xjCKt.mjs} +7 -2
  42. package/dist/{engine-BOO5TWZd.mjs.map → engine-BI2xjCKt.mjs.map} +1 -1
  43. package/dist/{engine-C0N2d1i5.cjs → engine-y53kE_3H.cjs} +71 -66
  44. package/dist/{engine-C0N2d1i5.cjs.map → engine-y53kE_3H.cjs.map} +1 -1
  45. package/dist/{github-CEaFDL6t.mjs → github-BBIqk1Jv.mjs} +2 -2
  46. package/dist/{github-CEaFDL6t.mjs.map → github-BBIqk1Jv.mjs.map} +1 -1
  47. package/dist/{github-ClkdCOL9.cjs → github-Bmb45xUQ.cjs} +6 -6
  48. package/dist/{github-ClkdCOL9.cjs.map → github-Bmb45xUQ.cjs.map} +1 -1
  49. package/dist/{index-DOxmDKqv.d.mts → index-C7Tma2m1.d.cts} +2 -2
  50. package/dist/{index-Ccu0f_2m.d.cts.map → index-C7Tma2m1.d.cts.map} +1 -1
  51. package/dist/{index-Ccu0f_2m.d.cts → index-CNdSRwar.d.mts} +2 -2
  52. package/dist/{index-DOxmDKqv.d.mts.map → index-CNdSRwar.d.mts.map} +1 -1
  53. package/dist/index.cjs +175 -215
  54. package/dist/index.cjs.map +1 -1
  55. package/dist/index.mjs +103 -143
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/{migrate-BRbYtFXG.cjs → migrate-31JXUOaG.cjs} +4 -4
  58. package/dist/{migrate-BRbYtFXG.cjs.map → migrate-31JXUOaG.cjs.map} +1 -1
  59. package/dist/{migrate-DrO2p9Rl.mjs → migrate-BUBsUiM3.mjs} +2 -2
  60. package/dist/{migrate-DrO2p9Rl.mjs.map → migrate-BUBsUiM3.mjs.map} +1 -1
  61. package/dist/{migrate-D3NAT7Ns.mjs → migrate-DWVl5PQK.mjs} +2 -2
  62. package/dist/{migrate-D3NAT7Ns.mjs.map → migrate-DWVl5PQK.mjs.map} +1 -1
  63. package/dist/{migrate-D5_-ylI1.cjs → migrate-sny0NjKe.cjs} +7 -7
  64. package/dist/{migrate-D5_-ylI1.cjs.map → migrate-sny0NjKe.cjs.map} +1 -1
  65. package/dist/openapi.d.cts +1 -1
  66. package/dist/openapi.d.mts +1 -1
  67. package/dist/reconcile/public.d.cts +1 -1
  68. package/dist/reconcile/public.d.mts +1 -1
  69. package/dist/{resolve-C1muFos5.mjs → resolve-BF1ICosS.mjs} +3 -3
  70. package/dist/{resolve-C1muFos5.mjs.map → resolve-BF1ICosS.mjs.map} +1 -1
  71. package/dist/{resolve-Fa1Ii0BK.cjs → resolve-DokLtTUb.cjs} +3 -3
  72. package/dist/{resolve-Fa1Ii0BK.cjs.map → resolve-DokLtTUb.cjs.map} +1 -1
  73. package/dist/{rollback-C9N5lKVf.cjs → rollback-CpOWRR9H.cjs} +5 -5
  74. package/dist/{rollback-C9N5lKVf.cjs.map → rollback-CpOWRR9H.cjs.map} +1 -1
  75. package/dist/{rollback-DeQzbRqM.mjs → rollback-sg0ZhKGG.mjs} +3 -3
  76. package/dist/{rollback-DeQzbRqM.mjs.map → rollback-sg0ZhKGG.mjs.map} +1 -1
  77. package/dist/{runtime-BSvzPqXW.d.mts → runtime-B5bYom9w.d.mts} +2 -2
  78. package/dist/{runtime-BSvzPqXW.d.mts.map → runtime-B5bYom9w.d.mts.map} +1 -1
  79. package/dist/{runtime-Cm7QA53H.d.cts → runtime-BozOkPtG.d.cts} +2 -2
  80. package/dist/{runtime-Cm7QA53H.d.cts.map → runtime-BozOkPtG.d.cts.map} +1 -1
  81. package/dist/{state-CUecOCNJ.mjs → stale-DGzpiN5S.mjs} +103 -23
  82. package/dist/stale-DGzpiN5S.mjs.map +1 -0
  83. package/dist/{state-C2qi0iQw.cjs → stale-yu2FkH3G.cjs} +108 -22
  84. package/dist/stale-yu2FkH3G.cjs.map +1 -0
  85. package/dist/target/public.cjs +1 -1
  86. package/dist/target/public.d.cts +2 -2
  87. package/dist/target/public.d.mts +2 -2
  88. package/dist/target/public.mjs +1 -1
  89. package/dist/{types-OxE0OAn2.d.mts → types-B9yWJAis.d.mts} +1 -3
  90. package/dist/types-B9yWJAis.d.mts.map +1 -0
  91. package/dist/{types-BdptGBFS.d.cts → types-ct7pdQRf.d.cts} +1 -3
  92. package/dist/types-ct7pdQRf.d.cts.map +1 -0
  93. package/dist/workspace/index.d.cts +2 -2
  94. package/dist/workspace/index.d.mts +2 -2
  95. package/package.json +15 -15
  96. package/dist/state-C2qi0iQw.cjs.map +0 -1
  97. package/dist/state-CUecOCNJ.mjs.map +0 -1
  98. package/dist/types-BdptGBFS.d.cts.map +0 -1
  99. package/dist/types-OxE0OAn2.d.mts.map +0 -1
package/dist/index.mjs CHANGED
@@ -6,7 +6,7 @@ import { l as withOwningTsconfigJsx, r as discover, u as ConstructGenerator } fr
6
6
  import { t as appKey } from "./derive-B4vDpzgP.mjs";
7
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 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";
9
+ import { At as eventsBackendFor, Bt as findAvailablePort, Dt as imageBuildCredentials, Ft as fakeKey, G as workerEntryDir, H as workerUnits, Ht as loadEnvFiles, J as FAKE_ENV, K as QueueGenerator, Kt as secretsStoreFor, Lt as primaryPortKey, Ot as isImageBuild, Pt as describeServices, Q as reconcileWorkspace, Qt as projectKey, R as parseDevServices, Rt as createCredentialsPreload, U as WorkerGenerator, Ut as loadSecretsForApp, Vt as isPortAvailable, W as workerBundleName, Wt as prepareEntryCredentials, X as constructGlobs, Xt as getKeyPath, Y as backendsOf$1, Yt as FileSecretsStore, Z as derivedContainers, ct as quoteIdentifier, dn as toEmbeddableSecrets, dt as pgClient, et as LOCAL_CA_PATH, fn as withCustomSecret, jt as providerOf, kt as cacheBackendFor, ln as maskPassword, ot as postgresDatabaseNames, q as CronGenerator, tn as deployIdentity, tt as forgetState, y as dockerCommand, zt as createEntryWrapper } from "./stale-DGzpiN5S.mjs";
10
10
  import { i as telemetryFor, n as runtimeFor, t as EndpointGenerator } from "./EndpointGenerator-DftalLYg.mjs";
11
11
  import { generateOpenApi, openapiCommand, resolveOpenApiConfig } from "./openapi.mjs";
12
12
  import { s as isCacheBackend, t as SubscriberGenerator } from "./SubscriberGenerator-5looQ3gB.mjs";
@@ -14,8 +14,8 @@ import { a as describeHolder, i as assignAppPorts, o as holderOf, r as appTag, s
14
14
  import { n as driversFor, r as eventsBackendsIn, t as cacheBackendsIn } from "./drivers-Ch1rJitn.mjs";
15
15
  import { n as withCompute, r as withRoutes, t as manifestModule } from "./emit-C1e8qD08.mjs";
16
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";
17
+ import { t as deploy$1 } from "./deploy-Q6X6RXRG.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-IUuxRW0J.mjs";
19
19
  import { o as loadCredentialSchemas, t as CredentialsInvalid } from "./credentialSchemas-BJqRJNK4.mjs";
20
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";
@@ -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.76";
50
+ var version = "10.0.0-alpha.77";
51
51
  //#endregion
52
52
  //#region src/prompt.ts
53
53
  /**
@@ -1705,7 +1705,7 @@ async function devCommand(options) {
1705
1705
  let secretsJsonPath;
1706
1706
  let publicUrl;
1707
1707
  let manifest;
1708
- const appSecrets = await loadSecretsForApp(workspace ? await secretsStoreFor(workspace, config.stages.local) : new FileSecretsStore(secretsRoot), config.stages.local, workspaceAppName);
1708
+ const appSecrets = await loadSecretsForApp(workspace ? await secretsStoreFor(workspace, config.stages.local) : new FileSecretsStore(secretsRoot), config.stages.local);
1709
1709
  if (workspace) {
1710
1710
  const reconciled = await reconcileWorkspace(workspace, {
1711
1711
  stage: workspace.stages.local,
@@ -2053,9 +2053,9 @@ async function workspaceDevCommand(configured, options) {
2053
2053
  for (const { id, port } of fakes) logger$5.log(`🎭 ${id} fake: http://localhost:${port}`);
2054
2054
  logger$5.log(options.migrate || options.seed ? "🗄️ Migrating the databases" : "🗄️ Checking for pending migrations");
2055
2055
  if (options.migrate || options.seed) {
2056
- const { prepareDevDatabases } = await import("./migrate-DrO2p9Rl.mjs");
2056
+ const { prepareDevDatabases } = await import("./migrate-BUBsUiM3.mjs");
2057
2057
  await prepareDevDatabases(workspace, reconciled.env, { seed: !!options.seed });
2058
- } else await import("./migrate-DrO2p9Rl.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
2058
+ } else await import("./migrate-BUBsUiM3.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
2059
2059
  logger$5.log(`⚠️ Could not check for pending migrations: ${error instanceof Error ? error.message : String(error)}`);
2060
2060
  });
2061
2061
  const appUrls = {};
@@ -3063,7 +3063,7 @@ async function buildApp(input) {
3063
3063
  if (production?.bundle && !input.skipBundle) {
3064
3064
  const outputDir = join(appRoot, ".gkm", "server");
3065
3065
  const entryPoint = await writeSurfaceServer(outputDir, production);
3066
- const { bundleServer } = await import("./bundler-DO6bHhnb.mjs");
3066
+ const { bundleServer } = await import("./bundler-DgO_EMVs.mjs");
3067
3067
  await bundleServer({
3068
3068
  entryPoint,
3069
3069
  outputDir: join(outputDir, "dist"),
@@ -3187,7 +3187,7 @@ async function buildWorkers(input) {
3187
3187
  });
3188
3188
  logger$4.log(`Generated worker ${worker.id}: ${crons.length} crons, ${queues.length} queues, ${subscribers.length} subscribers`);
3189
3189
  if (!input.bundle) continue;
3190
- const { bundleServer } = await import("./bundler-DO6bHhnb.mjs");
3190
+ const { bundleServer } = await import("./bundler-DgO_EMVs.mjs");
3191
3191
  const outfile = workerBundleName(worker.id);
3192
3192
  await bundleServer({
3193
3193
  entryPoint,
@@ -3257,7 +3257,7 @@ async function buildForTarget(target, context, appRoot, workspaceRoot, endpointG
3257
3257
  let masterKey;
3258
3258
  if (context.production?.bundle && !skipBundle) {
3259
3259
  logger$4.log(`\n📦 Bundling production server...`);
3260
- const { bundleServer } = await import("./bundler-DO6bHhnb.mjs");
3260
+ const { bundleServer } = await import("./bundler-DgO_EMVs.mjs");
3261
3261
  const allConstructs = [
3262
3262
  ...endpoints.map((e) => e.construct),
3263
3263
  ...functions.map((f) => f.construct),
@@ -4027,13 +4027,6 @@ const SERVICE_DEFAULTS = {
4027
4027
  region: "us-east-1"
4028
4028
  }
4029
4029
  };
4030
- /** Default credentials for pgboss (not a Docker service, reuses postgres) */
4031
- const PGBOSS_DEFAULTS = {
4032
- host: "localhost",
4033
- port: 5432,
4034
- username: "pgboss",
4035
- database: "app"
4036
- };
4037
4030
  /**
4038
4031
  * Generate credentials for a specific service.
4039
4032
  */
@@ -4073,14 +4066,6 @@ function generateMinioEndpoint(creds) {
4073
4066
  return `http://${host}:${port}`;
4074
4067
  }
4075
4068
  /**
4076
- * Generate connection URL for pg-boss (uses PostgreSQL protocol).
4077
- * Format: pgboss://user:pass@host:port/db?schema=pgboss
4078
- */
4079
- function generatePgBossUrl(creds) {
4080
- const { username, password, host, port, database } = creds;
4081
- return `pgboss://${username}:${encodeURIComponent(password)}@${host}:${port}/${database}?schema=pgboss`;
4082
- }
4083
- /**
4084
4069
  * Generate connection URLs from service credentials.
4085
4070
  */
4086
4071
  function generateConnectionUrls(services) {
@@ -4088,7 +4073,6 @@ function generateConnectionUrls(services) {
4088
4073
  if (services.postgres) urls.DATABASE_URL = generatePostgresUrl(services.postgres);
4089
4074
  if (services.redis) urls.REDIS_URL = generateRedisUrl(services.redis);
4090
4075
  if (services.minio) urls.STORAGE_ENDPOINT = generateMinioEndpoint(services.minio);
4091
- if (services.pgboss) urls.EVENT_PUBLISHER_CONNECTION_STRING = generatePgBossUrl(services.pgboss);
4092
4076
  if (services.mailpit) {
4093
4077
  urls.SMTP_HOST = services.mailpit.host;
4094
4078
  urls.SMTP_PORT = String(services.mailpit.port);
@@ -4112,13 +4096,6 @@ function createStageSecrets(stage, services, options) {
4112
4096
  serviceCredentials.minio.username = options.projectName;
4113
4097
  }
4114
4098
  }
4115
- if (serviceCredentials.postgres && !serviceCredentials.pgboss) serviceCredentials.pgboss = {
4116
- ...PGBOSS_DEFAULTS,
4117
- password: generateSecurePassword(),
4118
- host: serviceCredentials.postgres.host,
4119
- port: serviceCredentials.postgres.port,
4120
- database: serviceCredentials.postgres.database
4121
- };
4122
4099
  return {
4123
4100
  stage,
4124
4101
  createdAt: now,
@@ -4981,25 +4958,25 @@ function loadPackageJson() {
4981
4958
  * Run: pnpm --filter @geekmidas/cli sync-versions
4982
4959
  */
4983
4960
  const GEEKMIDAS_VERSIONS = {
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
+ "@geekmidas/audit": "~10.0.0-alpha.77",
4962
+ "@geekmidas/auth": "~10.0.0-alpha.77",
4963
+ "@geekmidas/cache": "~10.0.0-alpha.77",
4964
+ "@geekmidas/client": "~10.0.0-alpha.77",
4965
+ "@geekmidas/cloud": "~10.0.0-alpha.77",
4966
+ "@geekmidas/constructs": "~10.0.0-alpha.77",
4967
+ "@geekmidas/db": "~10.0.0-alpha.77",
4968
+ "@geekmidas/emailkit": "~10.0.0-alpha.77",
4969
+ "@geekmidas/envkit": "~10.0.0-alpha.77",
4970
+ "@geekmidas/errors": "~10.0.0-alpha.77",
4971
+ "@geekmidas/events": "~10.0.0-alpha.77",
4972
+ "@geekmidas/logger": "~10.0.0-alpha.77",
4973
+ "@geekmidas/manifest": "~10.0.0-alpha.77",
4974
+ "@geekmidas/rate-limit": "~10.0.0-alpha.77",
4975
+ "@geekmidas/schema": "~10.0.0-alpha.77",
4976
+ "@geekmidas/services": "~10.0.0-alpha.77",
4977
+ "@geekmidas/storage": "~10.0.0-alpha.77",
4978
+ "@geekmidas/telescope": "~10.0.0-alpha.77",
4979
+ "@geekmidas/testkit": "~10.0.0-alpha.77",
5003
4980
  "@geekmidas/cli": `~${loadPackageJson().version}`
5004
4981
  };
5005
4982
  //#endregion
@@ -6844,7 +6821,6 @@ docker-compose.constructs.yml
6844
6821
  .env
6845
6822
  .env.local
6846
6823
  .env.*.local
6847
- docker/.env
6848
6824
 
6849
6825
  # IDE
6850
6826
  .idea/
@@ -9913,7 +9889,6 @@ async function initCommand(projectName, options = {}) {
9913
9889
  };
9914
9890
  if (isFullstack) {
9915
9891
  customSecrets.AUTH_PORT = "3002";
9916
- customSecrets.AUTH_URL = "http://localhost:3002";
9917
9892
  customSecrets.BETTER_AUTH_SECRET = `better-auth-${Date.now()}-${Math.random().toString(36).slice(2)}`;
9918
9893
  customSecrets.BETTER_AUTH_URL = "http://localhost:3002";
9919
9894
  customSecrets.BETTER_AUTH_TRUSTED_ORIGINS = "http://localhost:3000,http://localhost:3001";
@@ -10077,27 +10052,18 @@ var NotAnAwsRegion = class extends Error {
10077
10052
  //#endregion
10078
10053
  //#region src/setup/fullstack-secrets.ts
10079
10054
  /**
10080
- * Generate a secure random password for database users.
10081
- * Uses a combination of timestamp and random bytes for uniqueness.
10082
- */
10083
- function generateDbPassword() {
10084
- return `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}${Math.random().toString(36).slice(2)}`;
10085
- }
10086
- /**
10087
- * Generate database URL for an app.
10088
- * All apps connect to the same database, but use different users/schemas.
10089
- */
10090
- function generateDbUrl(appName, password, projectName, host = "localhost", port = 5432) {
10091
- return `postgresql://${appName.replace(/-/g, "_")}:${password}@${host}:${port}/${`${projectName.replace(/-/g, "_")}_dev`}`;
10092
- }
10093
- /**
10094
10055
  * Generate fullstack-aware custom secrets for a workspace.
10095
10056
  *
10096
10057
  * Generates:
10097
10058
  * - Common secrets: PORT, LOG_LEVEL, JWT_SECRET (no `NODE_ENV` — the command
10098
10059
  * decides that; see `gkm init`)
10099
- * - Per-app database passwords and URLs for backend apps with db service
10100
10060
  * - Better-auth secrets for apps using the better-auth framework
10061
+ *
10062
+ * No address of anything a construct declares — a database's or a tenant's
10063
+ * URL, a surface's or a site's. Those are derived from the construct, with
10064
+ * passwords from the stage, and one stored here would be a value set by hand,
10065
+ * which wins over the derived one: a `localhost` URL handed to a container,
10066
+ * with a password no role has.
10101
10067
  */
10102
10068
  function generateFullstackCustomSecrets(workspace, containers = []) {
10103
10069
  const hasDb = containers.includes("postgres");
@@ -10107,22 +10073,10 @@ function generateFullstackCustomSecrets(workspace, containers = []) {
10107
10073
  JWT_SECRET: `dev-${Date.now()}-${Math.random().toString(36).slice(2)}`
10108
10074
  };
10109
10075
  if (!hasDb) return customs;
10110
- const frontendPorts = [];
10111
- for (const [appName, appConfig] of Object.entries(workspace.apps)) {
10112
- if (appConfig.type === "web") {
10113
- frontendPorts.push(appConfig.port);
10114
- const upperName = appName.toUpperCase();
10115
- customs[`${upperName}_URL`] = `http://localhost:${appConfig.port}`;
10116
- continue;
10117
- }
10118
- if (appConfig.type === "mobile") continue;
10119
- const password = generateDbPassword();
10120
- const upperName = appName.toUpperCase();
10121
- customs[`${upperName}_DATABASE_URL`] = generateDbUrl(appName, password, workspace.name);
10122
- customs[`${upperName}_DB_PASSWORD`] = password;
10076
+ for (const appConfig of Object.values(workspace.apps)) {
10077
+ if (appConfig.type === "web" || appConfig.type === "mobile") continue;
10123
10078
  if (appConfig.framework === "better-auth") {
10124
10079
  customs.AUTH_PORT = String(appConfig.port);
10125
- customs.AUTH_URL = `http://localhost:${appConfig.port}`;
10126
10080
  customs.BETTER_AUTH_SECRET = `better-auth-${Date.now()}-${generateSecurePassword(16)}`;
10127
10081
  customs.BETTER_AUTH_URL = `http://localhost:${appConfig.port}`;
10128
10082
  }
@@ -10130,25 +10084,6 @@ function generateFullstackCustomSecrets(workspace, containers = []) {
10130
10084
  if (customs.BETTER_AUTH_SECRET) customs.BETTER_AUTH_TRUSTED_ORIGINS = Object.values(workspace.apps).map((a) => a.port).map((p) => `http://localhost:${p}`).join(",");
10131
10085
  return customs;
10132
10086
  }
10133
- /**
10134
- * Extract *_DB_PASSWORD keys from secrets and write docker/.env.
10135
- *
10136
- * The docker/.env file contains database passwords that the PostgreSQL
10137
- * init script reads to create per-app database users.
10138
- */
10139
- async function writeDockerEnvFromSecrets(secrets, workspaceRoot) {
10140
- const dbPasswordEntries = Object.entries(secrets.custom).filter(([key]) => key.endsWith("_DB_PASSWORD"));
10141
- if (secrets.services.pgboss && !dbPasswordEntries.some(([key]) => key === "PGBOSS_DB_PASSWORD")) dbPasswordEntries.push(["PGBOSS_DB_PASSWORD", secrets.services.pgboss.password]);
10142
- if (dbPasswordEntries.length === 0) return;
10143
- const envContent = `# Auto-generated docker environment file
10144
- # Contains database passwords for docker-compose postgres init
10145
- # This file is gitignored - do not commit to version control
10146
- ${dbPasswordEntries.map(([key, value]) => `${key}=${value}`).join("\n")}
10147
- `;
10148
- const envPath = join(workspaceRoot, "docker", ".env");
10149
- await mkdir(dirname(envPath), { recursive: true });
10150
- await writeFile(envPath, envContent);
10151
- }
10152
10087
  //#endregion
10153
10088
  //#region src/secrets/index.ts
10154
10089
  const logger$2 = console;
@@ -10235,6 +10170,47 @@ async function secretsSetCommand(key, value, options) {
10235
10170
  await store.write(stage, withCustomSecret(secrets, key, secretValue));
10236
10171
  logger$2.log(`\n✓ Secret "${key}" set for stage "${stage}" (${store.name})`);
10237
10172
  }
10173
+ /** `gkm secrets:unset` for a key the stage does not hold. */
10174
+ var SecretNotSet = class extends Error {
10175
+ key;
10176
+ stage;
10177
+ constructor(key, stage) {
10178
+ super(`The stage '${stage}' holds no secret '${key}'. List what it holds with gkm secrets:show --stage ${stage}.`);
10179
+ this.key = key;
10180
+ this.stage = stage;
10181
+ this.name = "SecretNotSet";
10182
+ }
10183
+ };
10184
+ /** `gkm secrets:unset` on a stage that has no secrets at all. */
10185
+ var StageSecretsNotFound = class extends Error {
10186
+ stage;
10187
+ constructor(stage) {
10188
+ super(`The stage '${stage}' has no secrets, so there is nothing to remove.`);
10189
+ this.stage = stage;
10190
+ this.name = "StageSecretsNotFound";
10191
+ }
10192
+ };
10193
+ /**
10194
+ * Remove a custom secret from a stage, in the stage's own store — the file,
10195
+ * SSM or Secrets Manager. The rest of the stage is written back as it was.
10196
+ *
10197
+ * @throws {StageSecretsNotFound} when the stage holds no secrets
10198
+ * @throws {SecretNotSet} when it holds none by that key
10199
+ */
10200
+ async function secretsUnsetCommand(key, options) {
10201
+ const { stage } = options;
10202
+ const store = await storeFor(stage);
10203
+ const secrets = await store.read(stage);
10204
+ if (!secrets) throw new StageSecretsNotFound(stage);
10205
+ if (!(key in secrets.custom)) throw new SecretNotSet(key, stage);
10206
+ const { [key]: _removed, ...custom } = secrets.custom;
10207
+ await store.write(stage, {
10208
+ ...secrets,
10209
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
10210
+ custom
10211
+ });
10212
+ logger$2.log(`\n✓ Secret "${key}" removed from stage "${stage}" (${store.name})`);
10213
+ }
10238
10214
  /**
10239
10215
  * A third party's credentials, checked against the schema of the construct
10240
10216
  * that reads them before they are stored — what the app would otherwise
@@ -10391,8 +10367,7 @@ const logger$1 = console;
10391
10367
  * Orchestrates:
10392
10368
  * 1. Load workspace config
10393
10369
  * 2. Resolve secrets (local → the stage's store → generate fresh)
10394
- * 3. Write docker/.env from secrets
10395
- * 4. Start Docker services
10370
+ * 3. Start Docker services
10396
10371
  */
10397
10372
  async function setupCommand(options = {}) {
10398
10373
  logger$1.log("\n🔧 Setting up the local environment...\n");
@@ -10405,20 +10380,13 @@ async function setupCommand(options = {}) {
10405
10380
  }
10406
10381
  const stage = options.stage ?? loadedConfig.workspace.stages.local;
10407
10382
  const { workspace } = loadedConfig;
10408
- const isMultiApp = Object.keys(workspace.apps).length > 1;
10409
10383
  logger$1.log(`📦 Workspace: ${workspace.name}`);
10410
10384
  logger$1.log(`📱 Apps: ${Object.keys(workspace.apps).join(", ")}`);
10411
10385
  logger$1.log(`🔑 Stage: ${stage}\n`);
10412
- const secrets = await resolveSecrets(stage, workspace, options);
10413
- if (!secrets) {
10386
+ if (!await resolveSecrets(stage, workspace, options)) {
10414
10387
  logger$1.error("❌ Failed to resolve secrets. Exiting.");
10415
10388
  process.exit(1);
10416
10389
  }
10417
- const containers = await derivedContainers(workspace, stage);
10418
- if (isMultiApp && containers.includes("postgres")) {
10419
- await writeDockerEnvFromSecrets(secrets, workspace.root);
10420
- logger$1.log("📄 Generated docker/.env with database passwords");
10421
- }
10422
10390
  if (!options.skipDocker) {
10423
10391
  logger$1.log("");
10424
10392
  await reconcileLocal(workspace, stage, options);
@@ -10515,24 +10483,6 @@ function reconcileSecrets(secrets, workspace, containers = []) {
10515
10483
  logger$1.log(` 🔄 Adding missing service credentials: ${name}`);
10516
10484
  changed = true;
10517
10485
  }
10518
- if (result.services.postgres && !result.services.pgboss) {
10519
- result = {
10520
- ...result,
10521
- services: {
10522
- ...result.services,
10523
- pgboss: {
10524
- host: result.services.postgres.host,
10525
- port: result.services.postgres.port,
10526
- username: "pgboss",
10527
- password: generateSecurePassword(),
10528
- database: result.services.postgres.database ?? "app"
10529
- }
10530
- }
10531
- };
10532
- result.urls = generateConnectionUrls(result.services);
10533
- logger$1.log(" 🔄 Adding missing service credentials: pgboss");
10534
- changed = true;
10535
- }
10536
10486
  if (Object.keys(workspace.apps).length > 1) {
10537
10487
  const expected = generateFullstackCustomSecrets(workspace, containers);
10538
10488
  const missing = {};
@@ -10791,7 +10741,7 @@ function testDatabases(reconciled) {
10791
10741
  * starts without the reference data the app needs.
10792
10742
  */
10793
10743
  async function migrateTestStage(workspace, env) {
10794
- const { migrateAndSeed } = await import("./migrate-DrO2p9Rl.mjs");
10744
+ const { migrateAndSeed } = await import("./migrate-BUBsUiM3.mjs");
10795
10745
  const { discover } = await import("./discover-BPelzeGW.mjs").then((n) => n.i);
10796
10746
  const sources = {};
10797
10747
  const manifest = await discover({
@@ -11224,7 +11174,7 @@ program.command("migrate").description("Apply each database construct's migratio
11224
11174
  try {
11225
11175
  const globalOptions = program.opts();
11226
11176
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11227
- const { migrateCommand } = await import("./migrate-DrO2p9Rl.mjs");
11177
+ const { migrateCommand } = await import("./migrate-BUBsUiM3.mjs");
11228
11178
  await migrateCommand({
11229
11179
  ...options,
11230
11180
  ...construct ? { construct } : {}
@@ -11238,7 +11188,7 @@ program.command("seed").description("Migrate, then run each database construct's
11238
11188
  try {
11239
11189
  const globalOptions = program.opts();
11240
11190
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11241
- const { seedCommand } = await import("./migrate-DrO2p9Rl.mjs");
11191
+ const { seedCommand } = await import("./migrate-BUBsUiM3.mjs");
11242
11192
  await seedCommand({
11243
11193
  ...options,
11244
11194
  ...construct ? { construct } : {}
@@ -11252,7 +11202,7 @@ program.command("migration").description("Write a construct's next migration: an
11252
11202
  try {
11253
11203
  const globalOptions = program.opts();
11254
11204
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11255
- const { migrationCommand } = await import("./migrate-DrO2p9Rl.mjs");
11205
+ const { migrationCommand } = await import("./migrate-BUBsUiM3.mjs");
11256
11206
  await migrationCommand({
11257
11207
  construct,
11258
11208
  ...name ? { name } : {}
@@ -11342,11 +11292,21 @@ program.command("secrets:set").description("Set a custom secret for a stage").ar
11342
11292
  process.exit(1);
11343
11293
  }
11344
11294
  });
11295
+ program.command("secrets:unset").description("Remove a custom secret from a stage").argument("<key>", "Secret key (e.g., API_KEY)").requiredOption("--stage <stage>", "Stage name").action(async (key, options) => {
11296
+ try {
11297
+ const globalOptions = program.opts();
11298
+ if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11299
+ await secretsUnsetCommand(key, options);
11300
+ } catch (error) {
11301
+ console.error(formatError(error));
11302
+ process.exit(1);
11303
+ }
11304
+ });
11345
11305
  program.command("secrets:add").description("Build the keys a stage must be given — buckets, mail, file servers, third parties' credentials — across every app").requiredOption("--stage <stage>", "Stage name").option("--missing", "Only the keys the stage has not set").option("--json", "Print the keys as JSON and ask nothing").action(async (options) => {
11346
11306
  try {
11347
11307
  const globalOptions = program.opts();
11348
11308
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11349
- const { secretsAddCommand } = await import("./add-B7IMXzou.mjs");
11309
+ const { secretsAddCommand } = await import("./add-EPQO-_dt.mjs");
11350
11310
  await secretsAddCommand(options);
11351
11311
  } catch (error) {
11352
11312
  console.error(formatError(error));
@@ -11357,7 +11317,7 @@ program.command("encryption:rotate").description("Add a new current key to an En
11357
11317
  try {
11358
11318
  const globalOptions = program.opts();
11359
11319
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11360
- const { encryptionRotateCommand } = await import("./encryption-DC0rsR1W.mjs");
11320
+ const { encryptionRotateCommand } = await import("./encryption-D4Ykywfr.mjs");
11361
11321
  await encryptionRotateCommand(construct, options);
11362
11322
  } catch (error) {
11363
11323
  console.error(formatError(error));
@@ -11368,7 +11328,7 @@ program.command("encryption:retire").description("Remove an old key from an Encr
11368
11328
  try {
11369
11329
  const globalOptions = program.opts();
11370
11330
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11371
- const { encryptionRetireCommand } = await import("./encryption-DC0rsR1W.mjs");
11331
+ const { encryptionRetireCommand } = await import("./encryption-D4Ykywfr.mjs");
11372
11332
  await encryptionRetireCommand(construct, key, options);
11373
11333
  } catch (error) {
11374
11334
  console.error(formatError(error));
@@ -11411,7 +11371,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
11411
11371
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11412
11372
  const { loadWorkspaceConfig } = await import("./config.mjs");
11413
11373
  const { reconcileMissingSecrets } = await import("./reconcile--I7V4Klj.mjs");
11414
- const { secretsStoreFor } = await import("./state-CUecOCNJ.mjs").then((n) => n.qt);
11374
+ const { secretsStoreFor } = await import("./stale-DGzpiN5S.mjs").then((n) => n.Jt);
11415
11375
  const { workspace } = await loadWorkspaceConfig();
11416
11376
  const stage = options.stage ?? workspace.stages.local;
11417
11377
  const store = await secretsStoreFor(workspace, stage);
@@ -11420,7 +11380,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
11420
11380
  console.error(`No secrets found for stage "${stage}". Run "gkm secrets:init --stage ${stage}" first.`);
11421
11381
  process.exit(1);
11422
11382
  }
11423
- const { derivedContainers } = await import("./state-CUecOCNJ.mjs").then((n) => n.Q);
11383
+ const { derivedContainers } = await import("./stale-DGzpiN5S.mjs").then((n) => n.$);
11424
11384
  const result = reconcileMissingSecrets(secrets, workspace, await derivedContainers(workspace, stage));
11425
11385
  if (!result) {
11426
11386
  console.log(`\n✓ Secrets for stage "${stage}" are up-to-date`);
@@ -11438,7 +11398,7 @@ program.command("secrets:migrate").description("Copy a deployed stage's secrets
11438
11398
  try {
11439
11399
  const globalOptions = program.opts();
11440
11400
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11441
- const { secretsMigrateCommand } = await import("./migrate-D3NAT7Ns.mjs");
11401
+ const { secretsMigrateCommand } = await import("./migrate-DWVl5PQK.mjs");
11442
11402
  await secretsMigrateCommand(options);
11443
11403
  } catch (error) {
11444
11404
  console.error(formatError(error));
@@ -11446,7 +11406,7 @@ program.command("secrets:migrate").description("Copy a deployed stage's secrets
11446
11406
  }
11447
11407
  });
11448
11408
  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) => {
11449
- const { deployCli } = await import("./cli-BCPOHmg9.mjs");
11409
+ const { deployCli } = await import("./cli-B74Ru-V1.mjs");
11450
11410
  const globalOptions = program.opts();
11451
11411
  const code = await deployCli({
11452
11412
  cwd: resolve(globalOptions.cwd ?? process.cwd()),
@@ -11463,7 +11423,7 @@ program.command("deploy").description("Deploy a stage through its target").optio
11463
11423
  });
11464
11424
  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) => {
11465
11425
  try {
11466
- const { rollbackStage } = await import("./rollback-DeQzbRqM.mjs").then((n) => n.a);
11426
+ const { rollbackStage } = await import("./rollback-sg0ZhKGG.mjs").then((n) => n.a);
11467
11427
  const { terminalCredentials } = await import("./terminal-BdvrmkaC.mjs");
11468
11428
  const globalOptions = program.opts();
11469
11429
  await rollbackStage({
@@ -11499,7 +11459,7 @@ program.command("deploy:github").description("Let GitHub Actions deploy a stage:
11499
11459
  try {
11500
11460
  const globalOptions = program.opts();
11501
11461
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11502
- const { deployGithubCommand } = await import("./github-CEaFDL6t.mjs");
11462
+ const { deployGithubCommand } = await import("./github-BBIqk1Jv.mjs");
11503
11463
  await deployGithubCommand(options);
11504
11464
  } catch (error) {
11505
11465
  console.error(formatError(error));