@mesh-tech/mesh-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/bin/mesh.d.ts +16 -0
  2. package/dist/bin/mesh.d.ts.map +1 -0
  3. package/dist/bin/mesh.js +40 -0
  4. package/dist/bin/mesh.js.map +1 -0
  5. package/dist/src/commands/create-app.d.ts +10 -0
  6. package/dist/src/commands/create-app.d.ts.map +1 -0
  7. package/dist/src/commands/create-app.js +176 -0
  8. package/dist/src/commands/create-app.js.map +1 -0
  9. package/dist/src/commands/db/connect.d.ts +13 -0
  10. package/dist/src/commands/db/connect.d.ts.map +1 -0
  11. package/dist/src/commands/db/connect.js +68 -0
  12. package/dist/src/commands/db/connect.js.map +1 -0
  13. package/dist/src/commands/db/credentials.d.ts +16 -0
  14. package/dist/src/commands/db/credentials.d.ts.map +1 -0
  15. package/dist/src/commands/db/credentials.js +56 -0
  16. package/dist/src/commands/db/credentials.js.map +1 -0
  17. package/dist/src/commands/db/env.d.ts +15 -0
  18. package/dist/src/commands/db/env.d.ts.map +1 -0
  19. package/dist/src/commands/db/env.js +50 -0
  20. package/dist/src/commands/db/env.js.map +1 -0
  21. package/dist/src/commands/db/exec.d.ts +54 -0
  22. package/dist/src/commands/db/exec.d.ts.map +1 -0
  23. package/dist/src/commands/db/exec.js +331 -0
  24. package/dist/src/commands/db/exec.js.map +1 -0
  25. package/dist/src/commands/db/index.d.ts +12 -0
  26. package/dist/src/commands/db/index.d.ts.map +1 -0
  27. package/dist/src/commands/db/index.js +62 -0
  28. package/dist/src/commands/db/index.js.map +1 -0
  29. package/dist/src/commands/db/psql.d.ts +16 -0
  30. package/dist/src/commands/db/psql.d.ts.map +1 -0
  31. package/dist/src/commands/db/psql.js +133 -0
  32. package/dist/src/commands/db/psql.js.map +1 -0
  33. package/dist/src/commands/deploy.d.ts +24 -0
  34. package/dist/src/commands/deploy.d.ts.map +1 -0
  35. package/dist/src/commands/deploy.js +228 -0
  36. package/dist/src/commands/deploy.js.map +1 -0
  37. package/dist/src/commands/dev.d.ts +17 -0
  38. package/dist/src/commands/dev.d.ts.map +1 -0
  39. package/dist/src/commands/dev.js +1248 -0
  40. package/dist/src/commands/dev.js.map +1 -0
  41. package/dist/src/commands/devbox.d.ts +22 -0
  42. package/dist/src/commands/devbox.d.ts.map +1 -0
  43. package/dist/src/commands/devbox.js +463 -0
  44. package/dist/src/commands/devbox.js.map +1 -0
  45. package/dist/src/commands/login.d.ts +47 -0
  46. package/dist/src/commands/login.d.ts.map +1 -0
  47. package/dist/src/commands/login.js +344 -0
  48. package/dist/src/commands/login.js.map +1 -0
  49. package/dist/src/commands/registry.d.ts +20 -0
  50. package/dist/src/commands/registry.d.ts.map +1 -0
  51. package/dist/src/commands/registry.js +336 -0
  52. package/dist/src/commands/registry.js.map +1 -0
  53. package/dist/src/commands/secrets/exec.d.ts +17 -0
  54. package/dist/src/commands/secrets/exec.d.ts.map +1 -0
  55. package/dist/src/commands/secrets/exec.js +132 -0
  56. package/dist/src/commands/secrets/exec.js.map +1 -0
  57. package/dist/src/commands/secrets/index.d.ts +10 -0
  58. package/dist/src/commands/secrets/index.d.ts.map +1 -0
  59. package/dist/src/commands/secrets/index.js +35 -0
  60. package/dist/src/commands/secrets/index.js.map +1 -0
  61. package/dist/src/commands/secrets/set.d.ts +22 -0
  62. package/dist/src/commands/secrets/set.d.ts.map +1 -0
  63. package/dist/src/commands/secrets/set.js +234 -0
  64. package/dist/src/commands/secrets/set.js.map +1 -0
  65. package/dist/src/commands/stack.d.ts +17 -0
  66. package/dist/src/commands/stack.d.ts.map +1 -0
  67. package/dist/src/commands/stack.js +175 -0
  68. package/dist/src/commands/stack.js.map +1 -0
  69. package/dist/src/commands/tunnel/index.d.ts +14 -0
  70. package/dist/src/commands/tunnel/index.d.ts.map +1 -0
  71. package/dist/src/commands/tunnel/index.js +217 -0
  72. package/dist/src/commands/tunnel/index.js.map +1 -0
  73. package/dist/src/index.d.ts +7 -0
  74. package/dist/src/index.d.ts.map +1 -0
  75. package/dist/src/index.js +7 -0
  76. package/dist/src/index.js.map +1 -0
  77. package/dist/src/utils/bastion.d.ts +43 -0
  78. package/dist/src/utils/bastion.d.ts.map +1 -0
  79. package/dist/src/utils/bastion.js +77 -0
  80. package/dist/src/utils/bastion.js.map +1 -0
  81. package/dist/src/utils/context.d.ts +29 -0
  82. package/dist/src/utils/context.d.ts.map +1 -0
  83. package/dist/src/utils/context.js +132 -0
  84. package/dist/src/utils/context.js.map +1 -0
  85. package/dist/src/utils/credentials.d.ts +61 -0
  86. package/dist/src/utils/credentials.d.ts.map +1 -0
  87. package/dist/src/utils/credentials.js +145 -0
  88. package/dist/src/utils/credentials.js.map +1 -0
  89. package/dist/src/utils/index.d.ts +9 -0
  90. package/dist/src/utils/index.d.ts.map +1 -0
  91. package/dist/src/utils/index.js +9 -0
  92. package/dist/src/utils/index.js.map +1 -0
  93. package/dist/src/utils/log.d.ts +8 -0
  94. package/dist/src/utils/log.d.ts.map +1 -0
  95. package/dist/src/utils/log.js +17 -0
  96. package/dist/src/utils/log.js.map +1 -0
  97. package/dist/src/utils/pulumi.d.ts +24 -0
  98. package/dist/src/utils/pulumi.d.ts.map +1 -0
  99. package/dist/src/utils/pulumi.js +63 -0
  100. package/dist/src/utils/pulumi.js.map +1 -0
  101. package/package.json +50 -0
  102. package/templates/api-web-db/api/.dockerignore +2 -0
  103. package/templates/api-web-db/api/Dockerfile +16 -0
  104. package/templates/api-web-db/api/package.json.hbs +21 -0
  105. package/templates/api-web-db/api/src/index.ts.hbs +123 -0
  106. package/templates/api-web-db/api/tsconfig.json +13 -0
  107. package/templates/api-web-db/package.json.hbs +27 -0
  108. package/templates/api-web-db/sst.config.ts.hbs +151 -0
  109. package/templates/api-web-db/tsconfig.json +11 -0
  110. package/templates/api-web-db/web/.dockerignore +3 -0
  111. package/templates/api-web-db/web/Dockerfile +17 -0
  112. package/templates/api-web-db/web/app/lib/db.server.ts +36 -0
  113. package/templates/api-web-db/web/app/root.tsx +29 -0
  114. package/templates/api-web-db/web/app/routes/home.tsx.hbs +114 -0
  115. package/templates/api-web-db/web/app/routes.ts +3 -0
  116. package/templates/api-web-db/web/package.json.hbs +30 -0
  117. package/templates/api-web-db/web/prisma/schema.prisma +25 -0
  118. package/templates/api-web-db/web/prisma.config.ts +18 -0
  119. package/templates/api-web-db/web/react-router.config.ts +5 -0
  120. package/templates/api-web-db/web/tsconfig.json +19 -0
  121. package/templates/api-web-db/web/vite.config.ts +9 -0
  122. package/templates/temporal-api-worker/README.md.hbs +133 -0
  123. package/templates/temporal-api-worker/api/.dockerignore +4 -0
  124. package/templates/temporal-api-worker/api/Dockerfile +13 -0
  125. package/templates/temporal-api-worker/api/package.json.hbs +23 -0
  126. package/templates/temporal-api-worker/api/src/encryption-codec.ts +133 -0
  127. package/templates/temporal-api-worker/api/src/index.ts.hbs +145 -0
  128. package/templates/temporal-api-worker/api/tsconfig.json +14 -0
  129. package/templates/temporal-api-worker/package.json.hbs +29 -0
  130. package/templates/temporal-api-worker/sst.config.ts.hbs +161 -0
  131. package/templates/temporal-api-worker/tsconfig.json +10 -0
  132. package/templates/temporal-api-worker/worker/.dockerignore +4 -0
  133. package/templates/temporal-api-worker/worker/Dockerfile +11 -0
  134. package/templates/temporal-api-worker/worker/package.json.hbs +25 -0
  135. package/templates/temporal-api-worker/worker/src/activities.ts.hbs +49 -0
  136. package/templates/temporal-api-worker/worker/src/bundle-workflows.ts +38 -0
  137. package/templates/temporal-api-worker/worker/src/encryption-codec.ts +156 -0
  138. package/templates/temporal-api-worker/worker/src/worker.ts.hbs +93 -0
  139. package/templates/temporal-api-worker/worker/src/workflows.ts.hbs +60 -0
  140. package/templates/temporal-api-worker/worker/tsconfig.json +14 -0
@@ -0,0 +1,331 @@
1
+ /**
2
+ * mesh db exec - Run any command with database connection
3
+ *
4
+ * Three modes of operation:
5
+ *
6
+ * 1. Explicit mode (recommended for ad-hoc use):
7
+ * mesh db exec --tenant=<tenant> --env=<env> [--ssl=require] -- <command>
8
+ * - Uses explicit tenant/env to find platform bastion
9
+ * - Starts tunnel if needed
10
+ * - Similar to: mesh tunnel --tenant mesh --env dev
11
+ *
12
+ * 2. Direct mode (for sst dev integration):
13
+ * mesh db exec --secret=<arn> [--ssl=require] -- <command>
14
+ * - Uses secret ARN directly, expects tunnel already running
15
+ * - Ideal for sst.config.ts devCommand
16
+ *
17
+ * 3. Discovery mode (legacy, auto-detection):
18
+ * mesh db exec [--stage=<stage>] -- <command>
19
+ * - Auto-discovers tenant/env from filesystem and config files
20
+ * - Can be fragile if project structure doesn't match expected patterns
21
+ * - Starts tunnel if needed
22
+ *
23
+ * Examples:
24
+ * # Explicit mode (recommended)
25
+ * mesh db exec --tenant mesh --env dev --ssl=require -- npx prisma db push
26
+ * mesh db exec -t mesh -e dev -- npx prisma migrate dev
27
+ *
28
+ * # Direct mode (in sst.config.ts)
29
+ * mesh db exec --secret=arn:aws:secretsmanager:... --ssl=require -- pnpm dev
30
+ *
31
+ * # Discovery mode (legacy)
32
+ * mesh db exec -- npx prisma db push
33
+ * mesh db exec --stage=dev -- npx prisma migrate dev
34
+ */
35
+ import { spawn } from "child_process";
36
+ import * as net from "net";
37
+ import * as fs from "fs";
38
+ import * as path from "path";
39
+ import { SecretsManagerClient, GetSecretValueCommand, } from "@aws-sdk/client-secrets-manager";
40
+ import { detectContext, getPlatformBastionInfo, getDatabaseUrl, rewriteDatabaseUrl, logInfo, logSuccess, logError, logWarn, } from "../../utils/index.js";
41
+ const DEFAULT_LOCAL_PORT = 5432;
42
+ const MAX_RETRIES = 12;
43
+ const RETRY_DELAY_MS = 5000;
44
+ /**
45
+ * Find SST outputs by looking in current and parent directories.
46
+ */
47
+ function findSstOutputs() {
48
+ let dir = process.cwd();
49
+ const root = path.parse(dir).root;
50
+ while (dir !== root) {
51
+ const outputsPath = path.join(dir, ".sst", "outputs.json");
52
+ if (fs.existsSync(outputsPath)) {
53
+ try {
54
+ const content = fs.readFileSync(outputsPath, "utf-8");
55
+ const outputs = JSON.parse(content);
56
+ if (outputs.databaseUrl) {
57
+ const secretArnMatch = outputs.databaseUrl.match(/secretArn=([^&]+)/);
58
+ const secretArn = secretArnMatch
59
+ ? decodeURIComponent(secretArnMatch[1])
60
+ : undefined;
61
+ return {
62
+ databaseUrl: outputs.databaseUrl,
63
+ databaseName: outputs.databaseName,
64
+ secretArn,
65
+ rootDir: dir,
66
+ };
67
+ }
68
+ }
69
+ catch {
70
+ // Ignore parse errors, continue searching
71
+ }
72
+ }
73
+ dir = path.dirname(dir);
74
+ }
75
+ return null;
76
+ }
77
+ function checkPort(port) {
78
+ return new Promise((resolve) => {
79
+ const socket = new net.Socket();
80
+ socket.setTimeout(500);
81
+ socket.on("connect", () => { socket.destroy(); resolve(true); });
82
+ socket.on("timeout", () => { socket.destroy(); resolve(false); });
83
+ socket.on("error", () => { socket.destroy(); resolve(false); });
84
+ socket.connect(port, "localhost");
85
+ });
86
+ }
87
+ function sleep(ms) {
88
+ return new Promise((resolve) => setTimeout(resolve, ms));
89
+ }
90
+ async function startTunnelBackground(instanceId, rdsEndpoint, rdsPort, localPort) {
91
+ logInfo("Starting database tunnel...");
92
+ const tunnel = spawn("aws", [
93
+ "ssm",
94
+ "start-session",
95
+ "--target",
96
+ instanceId,
97
+ "--document-name",
98
+ "AWS-StartPortForwardingSessionToRemoteHost",
99
+ "--parameters",
100
+ JSON.stringify({
101
+ host: [rdsEndpoint],
102
+ portNumber: [String(rdsPort)],
103
+ localPortNumber: [String(localPort)],
104
+ }),
105
+ ], { stdio: ["ignore", "ignore", "ignore"] });
106
+ const maxAttempts = 15;
107
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
108
+ if (tunnel.exitCode !== null) {
109
+ throw new Error("Tunnel process died");
110
+ }
111
+ if (await checkPort(localPort)) {
112
+ logSuccess(`Tunnel started (PID: ${tunnel.pid})`);
113
+ return tunnel;
114
+ }
115
+ await sleep(1000);
116
+ }
117
+ tunnel.kill();
118
+ throw new Error(`Tunnel failed to start after ${maxAttempts} seconds`);
119
+ }
120
+ /**
121
+ * Fetch secret from Secrets Manager with retry logic for provisioning delays.
122
+ */
123
+ async function fetchSecretWithRetry(client, secretId) {
124
+ let lastError;
125
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
126
+ try {
127
+ const response = await client.send(new GetSecretValueCommand({ SecretId: secretId }));
128
+ if (!response.SecretString) {
129
+ throw new Error(`Secret ${secretId} has no string value`);
130
+ }
131
+ return JSON.parse(response.SecretString);
132
+ }
133
+ catch (error) {
134
+ lastError = error;
135
+ const isNotFound = error.name === "ResourceNotFoundException";
136
+ if (isNotFound && attempt < MAX_RETRIES) {
137
+ logWarn(`Secret not found (attempt ${attempt}/${MAX_RETRIES}), waiting...`);
138
+ await sleep(RETRY_DELAY_MS);
139
+ continue;
140
+ }
141
+ throw error;
142
+ }
143
+ }
144
+ throw lastError;
145
+ }
146
+ export async function execCommand(commandArgs, options) {
147
+ if (commandArgs.length === 0) {
148
+ logError("No command specified");
149
+ logInfo("Usage: mesh db exec [options] -- <command> [args...]");
150
+ logInfo("");
151
+ logInfo("Options:");
152
+ logInfo(" -t, --tenant <tenant> Platform tenant (e.g., mesh)");
153
+ logInfo(" -e, --env <env> Platform environment (e.g., dev)");
154
+ logInfo(" --secret <arn> Use secret ARN directly (skips SSM discovery)");
155
+ logInfo(" --db-host <host> Database host (skips SSM lookup)");
156
+ logInfo(" --ssl <mode> SSL mode: require, no-verify, disable");
157
+ logInfo(" --port <port> Local port for tunnel (default: 5432)");
158
+ logInfo(" --stage <stage> Stage for legacy discovery mode");
159
+ logInfo("");
160
+ logInfo("Examples:");
161
+ logInfo(" # Explicit mode (recommended)");
162
+ logInfo(" mesh db exec --tenant mesh --env dev --ssl=require -- npx prisma db push");
163
+ logInfo("");
164
+ logInfo(" # Direct mode (with existing tunnel)");
165
+ logInfo(" mesh db exec --secret=arn:aws:... --ssl=require -- pnpm dev");
166
+ process.exit(1);
167
+ }
168
+ const localPort = options.port ? parseInt(options.port, 10) : DEFAULT_LOCAL_PORT;
169
+ const secretsManager = new SecretsManagerClient({});
170
+ let tunnel = null;
171
+ let databaseUrl;
172
+ // ==========================================================================
173
+ // Direct mode: --secret provided, use it directly
174
+ // ==========================================================================
175
+ if (options.secret) {
176
+ logInfo(`Direct mode: using secret ${options.secret}`);
177
+ // Check if tunnel is running
178
+ const tunnelExists = await checkPort(localPort);
179
+ if (!tunnelExists) {
180
+ logError(`No tunnel found on port ${localPort}`);
181
+ logInfo("In direct mode, start a tunnel first with: mesh db connect");
182
+ logInfo("Or use discovery mode (without --secret) to auto-start tunnel");
183
+ process.exit(1);
184
+ }
185
+ logSuccess(`Using existing tunnel on port ${localPort}`);
186
+ // Fetch secret
187
+ logInfo(`Fetching credentials from secret...`);
188
+ const secret = await fetchSecretWithRetry(secretsManager, options.secret);
189
+ // Secret should contain DATABASE_URL directly (new format)
190
+ if (secret.DATABASE_URL) {
191
+ databaseUrl = secret.DATABASE_URL;
192
+ logSuccess("Got DATABASE_URL from secret");
193
+ }
194
+ else if (secret.username && secret.password) {
195
+ // Legacy format with individual fields
196
+ const dbName = secret.dbname ?? secret.database ?? "postgres";
197
+ databaseUrl = `postgresql://${secret.username}:${encodeURIComponent(secret.password)}@localhost:${localPort}/${dbName}`;
198
+ logSuccess(`Got credentials for user: ${secret.username}`);
199
+ }
200
+ else {
201
+ logError("Secret must contain DATABASE_URL or username/password fields");
202
+ process.exit(1);
203
+ }
204
+ // Rewrite DATABASE_URL for local tunnel
205
+ try {
206
+ const parsed = new URL(databaseUrl);
207
+ parsed.hostname = "localhost";
208
+ parsed.port = String(localPort);
209
+ // Apply SSL mode if specified
210
+ if (options.ssl) {
211
+ parsed.searchParams.set("sslmode", options.ssl);
212
+ if (options.ssl === "require" || options.ssl === "no-verify") {
213
+ parsed.searchParams.set("sslaccept", "accept_invalid_certs");
214
+ }
215
+ }
216
+ databaseUrl = parsed.toString();
217
+ }
218
+ catch {
219
+ logWarn("Could not parse DATABASE_URL for rewriting");
220
+ }
221
+ }
222
+ // ==========================================================================
223
+ // Discovery mode: find credentials via SSM lookups
224
+ // ==========================================================================
225
+ else {
226
+ // Use explicit --tenant/--env if provided, otherwise fall back to detectContext
227
+ let platformTenant;
228
+ let platformEnv;
229
+ if (options.tenant && options.env) {
230
+ // Explicit mode: use provided tenant/env directly (like tunnel command)
231
+ platformTenant = options.tenant;
232
+ platformEnv = options.env;
233
+ logInfo(`Explicit mode: Platform Tenant=${platformTenant}, Platform Env=${platformEnv}`);
234
+ }
235
+ else if (options.tenant || options.env) {
236
+ // Partial explicit mode - warn and require both
237
+ logError("Both --tenant and --env are required when using explicit mode");
238
+ logInfo("Usage: mesh db exec --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev -- <command>");
239
+ logInfo("Or omit both to use auto-detection");
240
+ process.exit(1);
241
+ }
242
+ else {
243
+ // Auto-detection mode (legacy behavior)
244
+ const ctx = detectContext();
245
+ platformTenant = ctx.tenant;
246
+ platformEnv = ctx.platformEnv;
247
+ logInfo(`Discovery mode: Platform=${platformEnv}, Tenant=${platformTenant}`);
248
+ }
249
+ // For credentials, use app-specific options if provided, else fall back to platform values
250
+ const appTenant = options.appTenant ?? platformTenant;
251
+ const appStage = options.appStage ?? platformEnv;
252
+ const appName = options.app;
253
+ if (appName) {
254
+ logInfo(`App credentials: tenant=${appTenant}, stage=${appStage}, app=${appName}`);
255
+ }
256
+ const tunnelExists = await checkPort(localPort);
257
+ // Try SST outputs first (fast path when sst dev is running)
258
+ const sstOutputs = findSstOutputs();
259
+ if (sstOutputs?.secretArn && tunnelExists) {
260
+ logInfo(`Found SST outputs in: ${sstOutputs.rootDir}`);
261
+ try {
262
+ const secret = await fetchSecretWithRetry(secretsManager, sstOutputs.secretArn);
263
+ if (secret.DATABASE_URL) {
264
+ databaseUrl = rewriteDatabaseUrl(secret.DATABASE_URL, {
265
+ endpoint: `localhost:${localPort}`,
266
+ sslMode: options.ssl,
267
+ });
268
+ logSuccess(`Using DATABASE_URL from SST outputs`);
269
+ }
270
+ }
271
+ catch {
272
+ logWarn("Could not fetch from SST outputs, falling back to credential lookup");
273
+ }
274
+ }
275
+ // Lookup credentials from Secrets Manager if not found in SST outputs
276
+ if (!databaseUrl) {
277
+ // Start tunnel if needed
278
+ if (!tunnelExists) {
279
+ const bastion = await getPlatformBastionInfo(platformTenant, platformEnv);
280
+ const rdsService = bastion.services.rds;
281
+ if (!rdsService) {
282
+ throw new Error("RDS service not available in platform bastion");
283
+ }
284
+ tunnel = await startTunnelBackground(bastion.instanceId, rdsService.host, rdsService.port, localPort);
285
+ }
286
+ else {
287
+ logSuccess(`Using existing tunnel on port ${localPort}`);
288
+ }
289
+ // Get DATABASE_URL and rewrite for tunnel
290
+ const rawUrl = await getDatabaseUrl(appTenant, appStage, { app: appName });
291
+ databaseUrl = rewriteDatabaseUrl(rawUrl, {
292
+ endpoint: `localhost:${localPort}`,
293
+ sslMode: options.ssl,
294
+ });
295
+ }
296
+ }
297
+ // ==========================================================================
298
+ // Set NODE_TLS_REJECT_UNAUTHORIZED for SSL through tunnels
299
+ // ==========================================================================
300
+ const env = { ...process.env, DATABASE_URL: databaseUrl };
301
+ if (options.ssl === "require" || options.ssl === "no-verify") {
302
+ env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
303
+ logInfo("Set NODE_TLS_REJECT_UNAUTHORIZED=0 for SSL through tunnel");
304
+ }
305
+ // ==========================================================================
306
+ // Cleanup and run command
307
+ // ==========================================================================
308
+ const cleanup = () => {
309
+ if (tunnel) {
310
+ logInfo("Stopping tunnel...");
311
+ tunnel.kill();
312
+ }
313
+ };
314
+ process.on("exit", cleanup);
315
+ process.on("SIGINT", cleanup);
316
+ process.on("SIGTERM", cleanup);
317
+ const [cmd, ...args] = commandArgs;
318
+ logInfo(`Running: ${commandArgs.join(" ")}`);
319
+ console.log("");
320
+ const child = spawn(cmd, args, { stdio: "inherit", env });
321
+ child.on("exit", (code) => {
322
+ cleanup();
323
+ process.exit(code ?? 0);
324
+ });
325
+ child.on("error", (err) => {
326
+ logError(`Failed to run command: ${err.message}`);
327
+ cleanup();
328
+ process.exit(1);
329
+ });
330
+ }
331
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../../src/commands/db/exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Database commands
3
+ *
4
+ * mesh db connect - Start tunnel for manual psql access
5
+ * mesh db credentials - Print database credentials
6
+ * mesh db env - Export DATABASE_URL for shell
7
+ * mesh db psql - Connect to database via psql
8
+ * mesh db exec - Run any command with database connection
9
+ */
10
+ import { Command } from "commander";
11
+ export declare function registerDbCommands(program: Command): void;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/db/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmDzD"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Database commands
3
+ *
4
+ * mesh db connect - Start tunnel for manual psql access
5
+ * mesh db credentials - Print database credentials
6
+ * mesh db env - Export DATABASE_URL for shell
7
+ * mesh db psql - Connect to database via psql
8
+ * mesh db exec - Run any command with database connection
9
+ */
10
+ import { connectCommand } from "./connect.js";
11
+ import { credentialsCommand } from "./credentials.js";
12
+ import { envCommand } from "./env.js";
13
+ import { psqlCommand } from "./psql.js";
14
+ import { execCommand } from "./exec.js";
15
+ export function registerDbCommands(program) {
16
+ const db = program
17
+ .command("db")
18
+ .description("Database utilities");
19
+ db.command("connect")
20
+ .description("Start DB tunnel for manual psql access")
21
+ .option("-t, --tenant <tenant>", "Platform tenant (e.g., mesh)")
22
+ .option("-e, --env <env>", "Platform environment (e.g., dev-temporal)")
23
+ .action(connectCommand);
24
+ db.command("credentials")
25
+ .alias("creds")
26
+ .description("Print database credentials")
27
+ .option("-t, --tenant <tenant>", "Platform tenant (e.g., mesh)")
28
+ .option("-e, --env <env>", "Platform environment (e.g., dev-temporal)")
29
+ .option("-a, --app <app>", "App name for credentials path (e.g., rdc)")
30
+ .option("--app-tenant <tenant>", "Tenant for app credentials (e.g., encore)")
31
+ .option("--app-stage <stage>", "Stage for app credentials (e.g., dev)")
32
+ .action(credentialsCommand);
33
+ db.command("env")
34
+ .description("Export DATABASE_URL for current shell (use with eval)")
35
+ .option("-t, --tenant <tenant>", "Platform tenant (e.g., mesh)")
36
+ .option("-e, --env <env>", "Platform environment (e.g., dev-temporal)")
37
+ .option("-a, --app <app>", "App name for credentials path (e.g., rdc)")
38
+ .option("--app-tenant <tenant>", "Tenant for app credentials (e.g., encore)")
39
+ .option("--app-stage <stage>", "Stage for app credentials (e.g., dev)")
40
+ .action(envCommand);
41
+ db.command("psql")
42
+ .description("Connect to database with psql")
43
+ .option("-t, --tenant <tenant>", "Platform tenant (e.g., mesh)")
44
+ .option("-e, --env <env>", "Platform environment (e.g., dev-temporal)")
45
+ .option("-a, --app <app>", "App name for credentials path (e.g., rdc)")
46
+ .option("--app-tenant <tenant>", "Tenant for app credentials (e.g., encore)")
47
+ .option("--app-stage <stage>", "Stage for app credentials (e.g., dev)")
48
+ .action(psqlCommand);
49
+ db.command("exec")
50
+ .description("Run any command with database connection")
51
+ .option("-t, --tenant <tenant>", "Platform tenant for bastion lookup (e.g., mesh)")
52
+ .option("-e, --env <env>", "Platform environment for bastion lookup (e.g., dev-temporal)")
53
+ .option("-a, --app <app>", "App name for credentials path (e.g., rdc)")
54
+ .option("--app-tenant <tenant>", "Tenant for app credentials if different from platform (e.g., encore)")
55
+ .option("--app-stage <stage>", "Stage for app credentials (e.g., dev)")
56
+ .option("--secret <arn>", "Use secret ARN directly (skips SSM discovery)")
57
+ .option("--ssl <mode>", "SSL mode: require, no-verify, disable")
58
+ .option("--port <port>", "Local tunnel port (default: 5432)")
59
+ .argument("<command...>", "Command and arguments to run")
60
+ .action(execCommand);
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/db/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAErC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,cAAc,CAAC,CAAC;IAE1B,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;SACtB,KAAK,CAAC,OAAO,CAAC;SACd,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,2CAA2C,CAAC;SAC5E,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE9B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,2CAA2C,CAAC;SAC5E,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,2CAA2C,CAAC;SAC5E,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,uBAAuB,EAAE,iDAAiD,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,8DAA8D,CAAC;SACzF,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,sEAAsE,CAAC;SACvG,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,cAAc,EAAE,uCAAuC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,mCAAmC,CAAC;SAC5D,QAAQ,CAAC,cAAc,EAAE,8BAA8B,CAAC;SACxD,MAAM,CAAC,WAAW,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * mesh db psql - Connect to database with psql
3
+ *
4
+ * Usage:
5
+ * mesh db psql --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev
6
+ */
7
+ interface PsqlOptions {
8
+ tenant?: string;
9
+ env?: string;
10
+ app?: string;
11
+ appTenant?: string;
12
+ appStage?: string;
13
+ }
14
+ export declare function psqlCommand(options: PsqlOptions): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=psql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psql.d.ts","sourceRoot":"","sources":["../../../../src/commands/db/psql.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAmED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FrE"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * mesh db psql - Connect to database with psql
3
+ *
4
+ * Usage:
5
+ * mesh db psql --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev
6
+ */
7
+ import { spawn } from "child_process";
8
+ import * as net from "net";
9
+ import { detectContext, getPlatformBastionInfo, getDatabaseUrl, logInfo, logSuccess, logError, } from "../../utils/index.js";
10
+ /**
11
+ * Start SSM tunnel in background and wait for it to be ready.
12
+ */
13
+ async function startTunnelBackground(instanceId, rdsHost, rdsPort, localPort) {
14
+ logInfo("Starting tunnel in background...");
15
+ const tunnel = spawn("aws", [
16
+ "ssm",
17
+ "start-session",
18
+ "--target",
19
+ instanceId,
20
+ "--document-name",
21
+ "AWS-StartPortForwardingSessionToRemoteHost",
22
+ "--parameters",
23
+ JSON.stringify({
24
+ host: [rdsHost],
25
+ portNumber: [String(rdsPort)],
26
+ localPortNumber: [String(localPort)],
27
+ }),
28
+ ], { stdio: ["ignore", "ignore", "ignore"] });
29
+ // Wait for tunnel to be ready (port listening)
30
+ const maxAttempts = 15;
31
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
32
+ if (tunnel.exitCode !== null) {
33
+ throw new Error("Tunnel process died");
34
+ }
35
+ const isListening = await checkPort(localPort);
36
+ if (isListening) {
37
+ logSuccess(`Tunnel started (PID: ${tunnel.pid})`);
38
+ return tunnel;
39
+ }
40
+ await sleep(1000);
41
+ }
42
+ tunnel.kill();
43
+ throw new Error(`Tunnel failed to start after ${maxAttempts} seconds`);
44
+ }
45
+ function checkPort(port) {
46
+ return new Promise((resolve) => {
47
+ const socket = new net.Socket();
48
+ socket.setTimeout(500);
49
+ socket.on("connect", () => { socket.destroy(); resolve(true); });
50
+ socket.on("timeout", () => { socket.destroy(); resolve(false); });
51
+ socket.on("error", () => { socket.destroy(); resolve(false); });
52
+ socket.connect(port, "localhost");
53
+ });
54
+ }
55
+ function sleep(ms) {
56
+ return new Promise((resolve) => setTimeout(resolve, ms));
57
+ }
58
+ export async function psqlCommand(options) {
59
+ // Resolve platform tenant/env
60
+ let platformTenant;
61
+ let platformEnv;
62
+ if (options.tenant && options.env) {
63
+ platformTenant = options.tenant;
64
+ platformEnv = options.env;
65
+ logInfo(`Platform: Tenant=${platformTenant}, Env=${platformEnv}`);
66
+ }
67
+ else if (options.tenant || options.env) {
68
+ logError("Both --tenant and --env are required");
69
+ logInfo("Usage: mesh db psql --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev");
70
+ process.exit(1);
71
+ }
72
+ else {
73
+ const ctx = detectContext();
74
+ platformTenant = ctx.tenant;
75
+ platformEnv = ctx.platformEnv;
76
+ logInfo(`Auto-detected: Tenant=${platformTenant}, Env=${platformEnv}`);
77
+ }
78
+ // Resolve app credentials
79
+ const appTenant = options.appTenant ?? platformTenant;
80
+ const appStage = options.appStage ?? platformEnv;
81
+ const appName = options.app;
82
+ if (appName) {
83
+ logInfo(`App credentials: tenant=${appTenant}, stage=${appStage}, app=${appName}`);
84
+ }
85
+ // Check for psql
86
+ const psqlCheck = spawn("which", ["psql"]);
87
+ await new Promise((resolve, reject) => {
88
+ psqlCheck.on("exit", (code) => {
89
+ if (code !== 0) {
90
+ logError("psql not found. Install with: brew install postgresql");
91
+ reject(new Error("psql not found"));
92
+ }
93
+ else {
94
+ resolve();
95
+ }
96
+ });
97
+ });
98
+ // Get bastion and start tunnel
99
+ const bastion = await getPlatformBastionInfo(platformTenant, platformEnv);
100
+ const rdsService = bastion.services.rds;
101
+ if (!rdsService) {
102
+ logError("RDS service not available in platform bastion");
103
+ process.exit(1);
104
+ }
105
+ const tunnel = await startTunnelBackground(bastion.instanceId, rdsService.host, rdsService.port, 5432);
106
+ // Cleanup on exit
107
+ const cleanup = () => {
108
+ logInfo("Stopping tunnel...");
109
+ tunnel.kill();
110
+ };
111
+ process.on("exit", cleanup);
112
+ process.on("SIGINT", cleanup);
113
+ process.on("SIGTERM", cleanup);
114
+ // Get DATABASE_URL and parse credentials
115
+ const databaseUrl = await getDatabaseUrl(appTenant, appStage, { app: appName });
116
+ const parsed = new URL(databaseUrl);
117
+ const username = parsed.username;
118
+ const password = decodeURIComponent(parsed.password);
119
+ const database = parsed.pathname.slice(1);
120
+ console.log("");
121
+ logInfo(`Connecting to ${database} as ${username}...`);
122
+ console.log("");
123
+ // Run psql
124
+ const psql = spawn("psql", ["-h", "localhost", "-p", "5432", "-U", username, "-d", database], {
125
+ stdio: "inherit",
126
+ env: { ...process.env, PGPASSWORD: password },
127
+ });
128
+ psql.on("exit", (code) => {
129
+ cleanup();
130
+ process.exit(code ?? 0);
131
+ });
132
+ }
133
+ //# sourceMappingURL=psql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psql.js","sourceRoot":"","sources":["../../../../src/commands/db/psql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * mesh deploy — Pulumi passthrough with automatic deployer role assumption.
3
+ *
4
+ * Credential resolution order:
5
+ * 1. If AWS credentials already in environment (CI/CD) → use directly
6
+ * 2. If ~/.config/mesh/credentials.json has a valid token for the
7
+ * platform context → AssumeRoleWithWebIdentity (Zitadel JWT)
8
+ * 3. Fallback → AssumeRole via current AWS session (SSO)
9
+ *
10
+ * The platform context (e.g., "mesh.dev") is derived from `mesh:platform`
11
+ * in the Pulumi stack config file (read directly from YAML, no AWS needed).
12
+ *
13
+ * Setup:
14
+ * pulumi config set mesh:deployerRole arn:aws:iam::123456789012:role/acme-dev-apps-deployer
15
+ *
16
+ * Examples:
17
+ * mesh deploy preview
18
+ * mesh deploy up --yes
19
+ * mesh deploy stack output dev --json
20
+ * mesh deploy destroy
21
+ */
22
+ import { Command } from "commander";
23
+ export declare function registerDeployCommand(program: Command): void;
24
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0HpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsH5D"}