@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,228 @@
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 { execFileSync } from "child_process";
23
+ import * as fs from "fs";
24
+ import * as path from "path";
25
+ import { logError, logInfo, logSuccess, logWarn } from "../utils/log.js";
26
+ import { findAppRoot, getCurrentStack, readStackConfig } from "../utils/pulumi.js";
27
+ import { readCredentials } from "./login.js";
28
+ // =============================================================================
29
+ // Helpers
30
+ // =============================================================================
31
+ /**
32
+ * Parse --stack or -s from the args array.
33
+ */
34
+ function parseStackFromArgs(args) {
35
+ for (let i = 0; i < args.length; i++) {
36
+ if (args[i] === "--stack" || args[i] === "-s") {
37
+ return args[i + 1] ?? null;
38
+ }
39
+ if (args[i]?.startsWith("--stack=")) {
40
+ return args[i].split("=")[1] ?? null;
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Derive the platform context key (e.g., "mesh.dev") from stack config.
47
+ *
48
+ * Reads `mesh:platform` from Pulumi.<stack>.yaml. Supports both formats:
49
+ * mesh:platform: '{"env":"dev","name":"mesh"}' → "mesh.dev"
50
+ * mesh:platform:
51
+ * name: mesh
52
+ * env: dev → "mesh.dev"
53
+ */
54
+ function derivePlatformContext(appRoot, stack) {
55
+ const configFile = path.join(appRoot, `Pulumi.${stack}.yaml`);
56
+ if (!fs.existsSync(configFile))
57
+ return null;
58
+ const content = fs.readFileSync(configFile, "utf-8");
59
+ // Try JSON-encoded string first (e.g., mesh:platform: '{"env":"dev","name":"mesh"}')
60
+ const jsonMatch = content.match(/mesh:platform:\s*'(\{[^']+\})'/);
61
+ if (jsonMatch) {
62
+ try {
63
+ const parsed = JSON.parse(jsonMatch[1]);
64
+ if (parsed.name && parsed.env)
65
+ return `${parsed.name}.${parsed.env}`;
66
+ }
67
+ catch {
68
+ // fall through
69
+ }
70
+ }
71
+ // Try YAML block format
72
+ const nameMatch = content.match(/mesh:platform:[\s\S]*?name:\s*(\S+)/);
73
+ const envMatch = content.match(/mesh:platform:[\s\S]*?env:\s*(\S+)/);
74
+ if (nameMatch && envMatch) {
75
+ return `${nameMatch[1]}.${envMatch[1]}`;
76
+ }
77
+ return null;
78
+ }
79
+ /**
80
+ * Assume an IAM role and return credentials as env vars.
81
+ */
82
+ function assumeRole(roleArn) {
83
+ try {
84
+ const result = execFileSync("aws", [
85
+ "sts", "assume-role",
86
+ "--role-arn", roleArn,
87
+ "--role-session-name", "mesh-deploy",
88
+ "--output", "json",
89
+ ], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
90
+ const parsed = JSON.parse(result);
91
+ const creds = parsed.Credentials;
92
+ return {
93
+ AWS_ACCESS_KEY_ID: creds.AccessKeyId,
94
+ AWS_SECRET_ACCESS_KEY: creds.SecretAccessKey,
95
+ AWS_SESSION_TOKEN: creds.SessionToken,
96
+ };
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ /**
103
+ * Assume role using Zitadel JWT via AssumeRoleWithWebIdentity.
104
+ */
105
+ function assumeRoleWithWebIdentity(roleArn, idToken, sessionName) {
106
+ try {
107
+ const result = execFileSync("aws", [
108
+ "sts", "assume-role-with-web-identity",
109
+ "--role-arn", roleArn,
110
+ "--web-identity-token", idToken,
111
+ "--role-session-name", sessionName,
112
+ "--output", "json",
113
+ ], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
114
+ const parsed = JSON.parse(result);
115
+ const creds = parsed.Credentials;
116
+ return {
117
+ AWS_ACCESS_KEY_ID: creds.AccessKeyId,
118
+ AWS_SECRET_ACCESS_KEY: creds.SecretAccessKey,
119
+ AWS_SESSION_TOKEN: creds.SessionToken,
120
+ };
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ // =============================================================================
127
+ // Command
128
+ // =============================================================================
129
+ export function registerDeployCommand(program) {
130
+ program
131
+ .command("deploy")
132
+ .description("Run pulumi with the app's deployer role (passthrough)")
133
+ .allowUnknownOption(true)
134
+ .allowExcessArguments(true)
135
+ .helpOption(false) // Don't consume --help, pass it to pulumi
136
+ .action((_opts, cmd) => {
137
+ const pulumiArgs = cmd.args;
138
+ // Find app root
139
+ const appRoot = findAppRoot(process.cwd());
140
+ if (!appRoot) {
141
+ logError("No Pulumi.yaml found. Run from within a Pulumi app directory.");
142
+ process.exit(1);
143
+ }
144
+ // Determine stack
145
+ const stack = parseStackFromArgs(pulumiArgs) ?? getCurrentStack(appRoot);
146
+ if (!stack) {
147
+ logError("Could not determine stack. Either:\n" +
148
+ " - Pass --stack <name> (e.g., mesh deploy preview --stack dev)\n" +
149
+ " - Select a stack first: pulumi stack select <name>");
150
+ process.exit(1);
151
+ }
152
+ // Read deployer role from stack config
153
+ const roleArn = readStackConfig(appRoot, stack, "mesh:deployerRole");
154
+ if (!roleArn) {
155
+ logError(`No mesh:deployerRole found in Pulumi.${stack}.yaml.\n` +
156
+ "Add it with:\n" +
157
+ " pulumi config set mesh:deployerRole arn:aws:iam::<account>:role/<tenant>-<stage>-apps-deployer");
158
+ process.exit(1);
159
+ }
160
+ const roleName = roleArn.split("/").pop() ?? roleArn;
161
+ // =====================================================================
162
+ // Credential resolution
163
+ // =====================================================================
164
+ let awsCreds = null;
165
+ // Path 1: Existing AWS credentials in environment (CI/CD)
166
+ if (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SESSION_TOKEN) {
167
+ logInfo(`Using existing AWS credentials from environment`);
168
+ // No role assumption needed — run pulumi directly
169
+ try {
170
+ execFileSync("pulumi", pulumiArgs, {
171
+ cwd: appRoot,
172
+ stdio: "inherit",
173
+ });
174
+ }
175
+ catch (err) {
176
+ process.exit(err.status ?? 1);
177
+ }
178
+ return;
179
+ }
180
+ // Path 2: Zitadel JWT via AssumeRoleWithWebIdentity
181
+ const platformContext = derivePlatformContext(appRoot, stack);
182
+ if (platformContext) {
183
+ const meshCreds = readCredentials(platformContext);
184
+ if (meshCreds && new Date(meshCreds.expiresAt) > new Date()) {
185
+ const sessionName = (meshCreds.email ?? "mesh-deploy")
186
+ .replace(/[^a-zA-Z0-9=,.@-]/g, "_")
187
+ .slice(0, 64);
188
+ logInfo(`Assuming ${roleName} via Zitadel (${meshCreds.email ?? platformContext})`);
189
+ awsCreds = assumeRoleWithWebIdentity(roleArn, meshCreds.idToken, sessionName);
190
+ if (awsCreds) {
191
+ logSuccess(`Assumed ${roleName} via Zitadel`);
192
+ }
193
+ else {
194
+ logWarn("Zitadel JWT auth failed — falling back to AWS SSO.\n" +
195
+ ` (Try: mesh login ${platformContext})`);
196
+ }
197
+ }
198
+ }
199
+ // Path 3: Fallback — AssumeRole via current AWS session (SSO)
200
+ if (!awsCreds) {
201
+ logInfo(`Assuming ${roleName} via AWS SSO`);
202
+ awsCreds = assumeRole(roleArn);
203
+ if (!awsCreds) {
204
+ logError(`Failed to assume role: ${roleArn}`);
205
+ process.exit(1);
206
+ }
207
+ logSuccess(`Assumed ${roleName}`);
208
+ }
209
+ // Build environment — inherit current env, override AWS creds,
210
+ // remove AWS_PROFILE so the assumed creds are used
211
+ const env = { ...process.env, ...awsCreds };
212
+ delete env.AWS_PROFILE;
213
+ // Exec pulumi with the assumed role
214
+ try {
215
+ execFileSync("pulumi", pulumiArgs, {
216
+ cwd: appRoot,
217
+ env,
218
+ stdio: "inherit",
219
+ });
220
+ }
221
+ catch (err) {
222
+ // execFileSync throws on non-zero exit. The output was already
223
+ // printed via stdio: "inherit", so just exit with the same code.
224
+ process.exit(err.status ?? 1);
225
+ }
226
+ });
227
+ }
228
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * mesh dev — Pulumi-output-driven local development orchestrator
3
+ *
4
+ * Reads `pulumi stack output dev --json` to discover services and tunnels,
5
+ * then launches each service's dev command in a tmux window.
6
+ *
7
+ * Usage:
8
+ * mesh dev Start all services, attach tmux
9
+ * mesh dev --headless Start without attaching
10
+ * mesh dev --kill Stop everything
11
+ * mesh dev --status Show service health (--json for structured)
12
+ * mesh dev logs <service> Tail a service's output
13
+ * mesh dev restart <svc> Restart a single service
14
+ */
15
+ import { Command } from "commander";
16
+ export declare function registerDevCommand(program: Command): void;
17
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/commands/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8yCpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiLzD"}