@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,336 @@
1
+ /**
2
+ * mesh registry — Manage npm registry authentication for @mesh-tech packages.
3
+ *
4
+ * Handles CodeArtifact token refresh and project .npmrc setup so that
5
+ * `pnpm install` can resolve @mesh-tech/* packages from the private registry.
6
+ *
7
+ * Credential resolution (same as mesh deploy):
8
+ * 1. Existing AWS credentials in environment (CI/CD) → use directly
9
+ * 2. Zitadel JWT from `mesh login` → AssumeRoleWithWebIdentity
10
+ * 3. AWS SSO / current profile → use directly
11
+ *
12
+ * Usage:
13
+ * mesh registry login — refresh token, ensure .npmrc
14
+ * mesh registry login mesh.dev — use Zitadel JWT for role assumption
15
+ * mesh registry login --ci — CI mode (skip .npmrc creation)
16
+ * mesh registry status — show current auth state
17
+ */
18
+ import { execFileSync } from "child_process";
19
+ import * as fs from "fs";
20
+ import * as path from "path";
21
+ import { logError, logInfo, logSuccess, logWarn } from "../utils/log.js";
22
+ import { readCredentials } from "./login.js";
23
+ // =============================================================================
24
+ // Constants — platform CodeArtifact registry
25
+ // =============================================================================
26
+ const CA_DOMAIN = "mesh-platform";
27
+ const CA_REPOSITORY = "mesh-packages";
28
+ const CA_NAMESPACE = "@mesh-tech";
29
+ const CA_REGION = "us-east-2";
30
+ // Default registry role — tenants get read access via their deployer role,
31
+ // but a dedicated read-only role can be configured here.
32
+ const DEFAULT_REGISTRY_ROLE = null;
33
+ // =============================================================================
34
+ // Helpers
35
+ // =============================================================================
36
+ /**
37
+ * Get the CodeArtifact repository endpoint URL.
38
+ */
39
+ function getEndpoint(env) {
40
+ try {
41
+ const result = execFileSync("aws", [
42
+ "codeartifact", "get-repository-endpoint",
43
+ "--domain", CA_DOMAIN,
44
+ "--repository", CA_REPOSITORY,
45
+ "--format", "npm",
46
+ "--region", CA_REGION,
47
+ "--output", "text",
48
+ "--query", "repositoryEndpoint",
49
+ ], {
50
+ encoding: "utf-8",
51
+ env: env ? { ...process.env, ...env } : undefined,
52
+ stdio: ["pipe", "pipe", "pipe"],
53
+ });
54
+ return result.trim() || null;
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Run `aws codeartifact login` to set the auth token in ~/.npmrc.
62
+ */
63
+ function codeartifactLogin(env) {
64
+ try {
65
+ execFileSync("aws", [
66
+ "codeartifact", "login",
67
+ "--tool", "npm",
68
+ "--domain", CA_DOMAIN,
69
+ "--repository", CA_REPOSITORY,
70
+ "--namespace", CA_NAMESPACE,
71
+ "--region", CA_REGION,
72
+ ], {
73
+ encoding: "utf-8",
74
+ env: env ? { ...process.env, ...env } : undefined,
75
+ stdio: ["pipe", "pipe", "pipe"],
76
+ });
77
+ return true;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ /**
84
+ * Assume an IAM role, return credential env vars.
85
+ */
86
+ function assumeRole(roleArn) {
87
+ try {
88
+ const result = execFileSync("aws", [
89
+ "sts", "assume-role",
90
+ "--role-arn", roleArn,
91
+ "--role-session-name", "mesh-registry",
92
+ "--output", "json",
93
+ ], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
94
+ const creds = JSON.parse(result).Credentials;
95
+ return {
96
+ AWS_ACCESS_KEY_ID: creds.AccessKeyId,
97
+ AWS_SECRET_ACCESS_KEY: creds.SecretAccessKey,
98
+ AWS_SESSION_TOKEN: creds.SessionToken,
99
+ };
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ /**
106
+ * Assume role via Zitadel JWT (AssumeRoleWithWebIdentity).
107
+ */
108
+ function assumeRoleWithWebIdentity(roleArn, idToken, sessionName) {
109
+ try {
110
+ const result = execFileSync("aws", [
111
+ "sts", "assume-role-with-web-identity",
112
+ "--role-arn", roleArn,
113
+ "--web-identity-token", idToken,
114
+ "--role-session-name", sessionName,
115
+ "--output", "json",
116
+ ], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
117
+ const creds = JSON.parse(result).Credentials;
118
+ return {
119
+ AWS_ACCESS_KEY_ID: creds.AccessKeyId,
120
+ AWS_SECRET_ACCESS_KEY: creds.SecretAccessKey,
121
+ AWS_SESSION_TOKEN: creds.SessionToken,
122
+ };
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }
128
+ /**
129
+ * Resolve AWS credentials for registry access.
130
+ *
131
+ * Returns env var overrides (or empty object if current env is fine).
132
+ */
133
+ function resolveCredentials(context, roleArn) {
134
+ // Path 1: Existing AWS credentials in environment
135
+ if (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SESSION_TOKEN) {
136
+ logInfo("Using existing AWS credentials from environment");
137
+ return {};
138
+ }
139
+ // Path 2: Zitadel JWT → AssumeRoleWithWebIdentity
140
+ if (context) {
141
+ const meshCreds = readCredentials(context);
142
+ if (meshCreds && new Date(meshCreds.expiresAt) > new Date()) {
143
+ const targetRole = roleArn || DEFAULT_REGISTRY_ROLE;
144
+ if (targetRole) {
145
+ const sessionName = (meshCreds.email ?? "mesh-registry")
146
+ .replace(/[^a-zA-Z0-9=,.@-]/g, "_")
147
+ .slice(0, 64);
148
+ logInfo(`Assuming registry role via Zitadel (${meshCreds.email ?? context})`);
149
+ const creds = assumeRoleWithWebIdentity(targetRole, meshCreds.idToken, sessionName);
150
+ if (creds) {
151
+ logSuccess("Assumed registry role via Zitadel");
152
+ return creds;
153
+ }
154
+ logWarn("Zitadel JWT role assumption failed — falling back to AWS profile");
155
+ }
156
+ else {
157
+ logInfo(`Zitadel auth available (${meshCreds.email}) but no registry role configured — using AWS profile`);
158
+ }
159
+ }
160
+ else if (meshCreds) {
161
+ logWarn(`Zitadel token expired for ${context}. Run: mesh login ${context}`);
162
+ }
163
+ else {
164
+ logWarn(`No Zitadel credentials for ${context}. Run: mesh login ${context}`);
165
+ }
166
+ }
167
+ // Path 3: AssumeRole via current AWS session (if a role was specified)
168
+ if (roleArn) {
169
+ logInfo(`Assuming ${roleArn.split("/").pop()} via AWS SSO`);
170
+ const creds = assumeRole(roleArn);
171
+ if (creds) {
172
+ logSuccess("Assumed registry role via AWS SSO");
173
+ return creds;
174
+ }
175
+ logWarn("Role assumption failed — trying current credentials directly");
176
+ }
177
+ // Path 4: Current AWS profile/credentials as-is
178
+ logInfo("Using current AWS profile");
179
+ return {};
180
+ }
181
+ /**
182
+ * Find project root by looking for pnpm-workspace.yaml, package.json, or .git
183
+ * walking up from cwd.
184
+ */
185
+ function findProjectRoot() {
186
+ let dir = process.cwd();
187
+ while (true) {
188
+ if (fs.existsSync(path.join(dir, "pnpm-workspace.yaml")) ||
189
+ fs.existsSync(path.join(dir, "pnpm-lock.yaml")) ||
190
+ fs.existsSync(path.join(dir, "Pulumi.yaml")) ||
191
+ fs.existsSync(path.join(dir, ".npmrc"))) {
192
+ return dir;
193
+ }
194
+ const parent = path.dirname(dir);
195
+ if (parent === dir)
196
+ return null;
197
+ dir = parent;
198
+ }
199
+ }
200
+ /**
201
+ * Ensure project .npmrc has the @mesh-tech registry scope entry.
202
+ * Creates the file if it doesn't exist. Doesn't touch auth tokens
203
+ * (those live in ~/.npmrc via `aws codeartifact login`).
204
+ */
205
+ function ensureProjectNpmrc(endpoint) {
206
+ const projectRoot = findProjectRoot() ?? process.cwd();
207
+ const npmrcPath = path.join(projectRoot, ".npmrc");
208
+ const scopeLine = `${CA_NAMESPACE}:registry=${endpoint}`;
209
+ if (!fs.existsSync(npmrcPath)) {
210
+ fs.writeFileSync(npmrcPath, scopeLine + "\n", "utf-8");
211
+ return { created: true, updated: false, path: npmrcPath };
212
+ }
213
+ const content = fs.readFileSync(npmrcPath, "utf-8");
214
+ // Check if scope already configured (with any endpoint)
215
+ const scopeRegex = new RegExp(`^${CA_NAMESPACE.replace("/", "\\/")}:registry=.+$`, "m");
216
+ if (scopeRegex.test(content)) {
217
+ // Check if it's the right endpoint
218
+ if (content.includes(scopeLine)) {
219
+ return { created: false, updated: false, path: npmrcPath };
220
+ }
221
+ // Update existing line
222
+ const updated = content.replace(scopeRegex, scopeLine);
223
+ fs.writeFileSync(npmrcPath, updated, "utf-8");
224
+ return { created: false, updated: true, path: npmrcPath };
225
+ }
226
+ // Append scope line
227
+ const separator = content.endsWith("\n") ? "" : "\n";
228
+ fs.writeFileSync(npmrcPath, content + separator + scopeLine + "\n", "utf-8");
229
+ return { created: false, updated: true, path: npmrcPath };
230
+ }
231
+ /**
232
+ * Check if the current ~/.npmrc has a valid CodeArtifact token for our registry.
233
+ */
234
+ function checkExistingToken() {
235
+ const homeNpmrc = path.join(process.env.HOME ?? "~", ".npmrc");
236
+ if (!fs.existsSync(homeNpmrc))
237
+ return { valid: false };
238
+ const content = fs.readFileSync(homeNpmrc, "utf-8");
239
+ // Look for a CodeArtifact token line for our domain
240
+ const hasToken = content.includes("mesh-platform") && content.includes("_authToken=");
241
+ if (!hasToken)
242
+ return { valid: false };
243
+ // Try a quick endpoint lookup to verify the token works
244
+ const endpoint = getEndpoint();
245
+ if (!endpoint)
246
+ return { valid: false };
247
+ return { valid: true, endpoint };
248
+ }
249
+ // =============================================================================
250
+ // Commands
251
+ // =============================================================================
252
+ export function registerRegistryCommands(program) {
253
+ const registry = program
254
+ .command("registry")
255
+ .description("Manage npm registry auth for @mesh-tech packages");
256
+ registry
257
+ .command("login")
258
+ .description("Authenticate with CodeArtifact and configure .npmrc")
259
+ .argument("[context]", 'Platform context for Zitadel auth (e.g., "mesh.dev")')
260
+ .option("--role <arn>", "IAM role ARN for registry access")
261
+ .option("--ci", "CI mode — refresh token only, skip project .npmrc setup")
262
+ .option("--skip-npmrc", "Skip project .npmrc setup")
263
+ .action(async (context, opts) => {
264
+ // Resolve AWS credentials
265
+ const awsCreds = resolveCredentials(context, opts.role);
266
+ const env = Object.keys(awsCreds).length > 0
267
+ ? { ...process.env, ...awsCreds }
268
+ : undefined;
269
+ // Step 1: Run `aws codeartifact login` (sets token in ~/.npmrc)
270
+ logInfo("Authenticating with CodeArtifact...");
271
+ if (!codeartifactLogin(env)) {
272
+ logError("CodeArtifact login failed.\n\n" +
273
+ "Check that your AWS credentials have codeartifact:GetAuthorizationToken permission.\n" +
274
+ "If using AWS SSO, run: aws sso login\n" +
275
+ "If using Zitadel: mesh login <context>");
276
+ process.exit(1);
277
+ }
278
+ logSuccess("CodeArtifact token refreshed (valid for 12 hours)");
279
+ // Step 2: Get endpoint URL
280
+ const endpoint = getEndpoint(env);
281
+ if (!endpoint) {
282
+ logWarn("Could not retrieve registry endpoint — .npmrc scope not configured");
283
+ logInfo("You may need to manually add to .npmrc:");
284
+ logInfo(` ${CA_NAMESPACE}:registry=https://mesh-platform-<ACCOUNT>.d.codeartifact.${CA_REGION}.amazonaws.com/npm/${CA_REPOSITORY}/`);
285
+ process.exit(0);
286
+ }
287
+ // Step 3: Ensure project .npmrc (unless --ci or --skip-npmrc)
288
+ if (!opts.ci && !opts.skipNpmrc) {
289
+ const result = ensureProjectNpmrc(endpoint);
290
+ if (result.created) {
291
+ logSuccess(`Created ${result.path} with ${CA_NAMESPACE} registry scope`);
292
+ }
293
+ else if (result.updated) {
294
+ logSuccess(`Updated ${CA_NAMESPACE} registry in ${result.path}`);
295
+ }
296
+ else {
297
+ logInfo(`${result.path} already configured`);
298
+ }
299
+ }
300
+ logSuccess(`Ready — run pnpm install to fetch ${CA_NAMESPACE} packages`);
301
+ });
302
+ registry
303
+ .command("status")
304
+ .description("Check current registry authentication status")
305
+ .action(() => {
306
+ const { valid, endpoint } = checkExistingToken();
307
+ if (!valid) {
308
+ logWarn("No valid CodeArtifact token found. Run: mesh registry login");
309
+ process.exit(1);
310
+ }
311
+ logSuccess("CodeArtifact token found in ~/.npmrc");
312
+ if (endpoint) {
313
+ logInfo(`Endpoint: ${endpoint}`);
314
+ }
315
+ // Check project .npmrc
316
+ const projectRoot = findProjectRoot();
317
+ if (projectRoot) {
318
+ const npmrcPath = path.join(projectRoot, ".npmrc");
319
+ if (fs.existsSync(npmrcPath)) {
320
+ const content = fs.readFileSync(npmrcPath, "utf-8");
321
+ if (content.includes(`${CA_NAMESPACE}:registry=`)) {
322
+ logSuccess(`Project .npmrc configured (${npmrcPath})`);
323
+ }
324
+ else {
325
+ logWarn(`Project .npmrc exists but missing ${CA_NAMESPACE} scope (${npmrcPath})`);
326
+ logInfo("Run: mesh registry login");
327
+ }
328
+ }
329
+ else {
330
+ logWarn(`No .npmrc in project root (${projectRoot})`);
331
+ logInfo("Run: mesh registry login");
332
+ }
333
+ }
334
+ });
335
+ }
336
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/commands/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * mesh secrets exec - Execute command with secrets from AWS Secrets Manager
3
+ *
4
+ * Fetches a JSON secret from Secrets Manager and injects all key-value pairs
5
+ * as environment variables before running the specified command.
6
+ *
7
+ * Usage:
8
+ * mesh secrets exec --secret=<name-or-arn> [--db-host=<host>] -- <command>
9
+ *
10
+ * Options:
11
+ * --db-host=<host> Rewrite DATABASE_URL host (for dev mode tunneling)
12
+ *
13
+ * Example:
14
+ * mesh secrets exec --secret=mesh/encore/dev/rdc/db-credentials --db-host=localhost -- pnpm dev
15
+ */
16
+ export declare function execCommand(args: string[]): Promise<void>;
17
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../../src/commands/secrets/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA4FH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D/D"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * mesh secrets exec - Execute command with secrets from AWS Secrets Manager
3
+ *
4
+ * Fetches a JSON secret from Secrets Manager and injects all key-value pairs
5
+ * as environment variables before running the specified command.
6
+ *
7
+ * Usage:
8
+ * mesh secrets exec --secret=<name-or-arn> [--db-host=<host>] -- <command>
9
+ *
10
+ * Options:
11
+ * --db-host=<host> Rewrite DATABASE_URL host (for dev mode tunneling)
12
+ *
13
+ * Example:
14
+ * mesh secrets exec --secret=mesh/encore/dev/rdc/db-credentials --db-host=localhost -- pnpm dev
15
+ */
16
+ import { spawn } from "child_process";
17
+ import { SecretsManagerClient, GetSecretValueCommand, } from "@aws-sdk/client-secrets-manager";
18
+ // Simple logging helpers
19
+ function logInfo(msg) {
20
+ console.log(`\u001b[36mℹ\u001b[0m ${msg}`);
21
+ }
22
+ function logSuccess(msg) {
23
+ console.log(`\u001b[32m✓\u001b[0m ${msg}`);
24
+ }
25
+ function logError(msg) {
26
+ console.error(`\u001b[31m✗\u001b[0m ${msg}`);
27
+ }
28
+ function parseArgs(args) {
29
+ const options = {};
30
+ let commandArgs = [];
31
+ for (let i = 0; i < args.length; i++) {
32
+ const arg = args[i];
33
+ if (arg === "--") {
34
+ commandArgs = args.slice(i + 1);
35
+ break;
36
+ }
37
+ if (arg.startsWith("--secret=")) {
38
+ options.secret = arg.substring("--secret=".length);
39
+ }
40
+ else if (arg === "--secret" && args[i + 1]) {
41
+ options.secret = args[++i];
42
+ }
43
+ else if (arg.startsWith("--db-host=")) {
44
+ options.dbHost = arg.substring("--db-host=".length);
45
+ }
46
+ else if (arg === "--db-host" && args[i + 1]) {
47
+ options.dbHost = args[++i];
48
+ }
49
+ }
50
+ return { options, commandArgs };
51
+ }
52
+ async function fetchSecret(client, secretId) {
53
+ const response = await client.send(new GetSecretValueCommand({ SecretId: secretId }));
54
+ if (!response.SecretString) {
55
+ throw new Error("Secret has no string value");
56
+ }
57
+ try {
58
+ return JSON.parse(response.SecretString);
59
+ }
60
+ catch {
61
+ throw new Error("Secret is not valid JSON");
62
+ }
63
+ }
64
+ /**
65
+ * Rewrite the host in a DATABASE_URL
66
+ * Useful for dev mode where we tunnel to the database via localhost
67
+ */
68
+ function rewriteDatabaseHost(databaseUrl, newHost) {
69
+ try {
70
+ const url = new URL(databaseUrl);
71
+ const originalHost = url.host;
72
+ url.hostname = newHost;
73
+ // Keep the original port if the new host doesn't include one
74
+ if (!newHost.includes(":")) {
75
+ url.port = url.port || "5432";
76
+ }
77
+ logInfo(`Rewrote DATABASE_URL host: ${originalHost} → ${url.host}`);
78
+ return url.toString();
79
+ }
80
+ catch {
81
+ logError(`Failed to parse DATABASE_URL for host rewrite`);
82
+ return databaseUrl;
83
+ }
84
+ }
85
+ export async function execCommand(args) {
86
+ const { options, commandArgs } = parseArgs(args);
87
+ if (!options.secret || commandArgs.length === 0) {
88
+ logError("Usage: mesh secrets exec --secret=<name-or-arn> [options] -- <command>");
89
+ logInfo("");
90
+ logInfo("Options:");
91
+ logInfo(" --secret=<name-or-arn> Secret name or ARN in Secrets Manager");
92
+ logInfo(" --db-host=<host> Rewrite DATABASE_URL host (for dev tunneling)");
93
+ logInfo("");
94
+ logInfo("Examples:");
95
+ logInfo(" mesh secrets exec --secret=mesh/tenant/stage/app/secret -- pnpm dev");
96
+ logInfo(" mesh secrets exec --secret=mesh/tenant/stage/app/db --db-host=localhost -- pnpm dev");
97
+ process.exit(1);
98
+ }
99
+ const secretsManager = new SecretsManagerClient({});
100
+ logInfo(`Fetching secret: ${options.secret}`);
101
+ let secretValues;
102
+ try {
103
+ secretValues = await fetchSecret(secretsManager, options.secret);
104
+ }
105
+ catch (error) {
106
+ logError(`Failed to fetch secret: ${error}`);
107
+ process.exit(1);
108
+ }
109
+ const envKeys = Object.keys(secretValues);
110
+ logSuccess(`Loaded ${envKeys.length} environment variable(s) from secret`);
111
+ // Rewrite DATABASE_URL host for dev mode tunneling
112
+ if (options.dbHost && secretValues.DATABASE_URL) {
113
+ secretValues.DATABASE_URL = rewriteDatabaseHost(secretValues.DATABASE_URL, options.dbHost);
114
+ }
115
+ // Build environment with secret values injected
116
+ const env = {
117
+ ...process.env,
118
+ ...secretValues,
119
+ };
120
+ const [cmd, ...cmdArgs] = commandArgs;
121
+ logInfo(`Running: ${commandArgs.join(" ")}`);
122
+ console.log("");
123
+ const child = spawn(cmd, cmdArgs, { stdio: "inherit", env });
124
+ child.on("exit", (code) => {
125
+ process.exit(code ?? 0);
126
+ });
127
+ child.on("error", (error) => {
128
+ logError(`Failed to start command: ${error.message}`);
129
+ process.exit(1);
130
+ });
131
+ }
132
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../../src/commands/secrets/exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * mesh secrets - Commands for working with AWS Secrets Manager
3
+ *
4
+ * Commands:
5
+ * mesh secrets exec - Run command with secrets injected as environment variables
6
+ * mesh secrets set - Set credentials for an external service
7
+ */
8
+ import { Command } from "commander";
9
+ export declare function registerSecretsCommands(program: Command): void;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/secrets/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B9D"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * mesh secrets - Commands for working with AWS Secrets Manager
3
+ *
4
+ * Commands:
5
+ * mesh secrets exec - Run command with secrets injected as environment variables
6
+ * mesh secrets set - Set credentials for an external service
7
+ */
8
+ import { execCommand } from "./exec.js";
9
+ import { setCommand } from "./set.js";
10
+ export function registerSecretsCommands(program) {
11
+ const secrets = program
12
+ .command("secrets")
13
+ .description("AWS Secrets Manager utilities");
14
+ secrets
15
+ .command("exec")
16
+ .description("Run command with secrets as environment variables")
17
+ .allowUnknownOption(true)
18
+ .action(async (_opts, cmd) => {
19
+ // Get all args after "secrets exec"
20
+ const args = cmd.args;
21
+ await execCommand(args);
22
+ });
23
+ secrets
24
+ .command("set [service]")
25
+ .description("Set credentials for an external service (e.g., mesh secrets set external/symitar)")
26
+ .option("--key <key>", "Instance key for multi-instance services (e.g., FI ID)")
27
+ .option("--all", "Prompt for all fields including optional ones")
28
+ .option("--json <json>", "Non-interactive: provide values as JSON")
29
+ .option("--stage <stage>", "Override stage detection")
30
+ .option("--region <region>", "AWS region (default: us-east-2)")
31
+ .action(async (service, opts) => {
32
+ await setCommand(service, opts);
33
+ });
34
+ }
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/secrets/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAEhD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mDAAmD,CAAC;SAChE,kBAAkB,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,oCAAoC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,mFAAmF,CAAC;SAChG,MAAM,CAAC,aAAa,EAAE,wDAAwD,CAAC;SAC/E,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,yCAAyC,CAAC;SAClE,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;SACrD,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * mesh secrets set — Set credentials for an external service.
3
+ *
4
+ * Reads the credential field schema from SSM (written by ExternalService),
5
+ * prompts interactively for each field, and writes to Secrets Manager.
6
+ *
7
+ * Usage:
8
+ * mesh secrets set external/symitar # single-instance
9
+ * mesh secrets set external/symitar --key=12345 # multi-instance (specific key)
10
+ * mesh secrets set external/symitar --all # include optional fields
11
+ * mesh secrets set external/symitar --non-interactive --json='{"baseUrl":"..."}'
12
+ *
13
+ * The command detects tenant/stage from Pulumi config in the current directory.
14
+ */
15
+ export declare function setCommand(servicePath: string | undefined, opts: {
16
+ key?: string;
17
+ all?: boolean;
18
+ json?: string;
19
+ stage?: string;
20
+ region?: string;
21
+ }): Promise<void>;
22
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../../src/commands/secrets/set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA4GH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,IAAI,EAAE;IACJ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CAkKf"}