@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,47 @@
1
+ /**
2
+ * mesh login — Authenticate with Zitadel via OIDC PKCE flow.
3
+ *
4
+ * Opens browser to Zitadel, receives auth code via localhost callback,
5
+ * exchanges for tokens, and caches at ~/.config/mesh/credentials.json.
6
+ *
7
+ * Config is read from ~/.config/mesh/config.json, keyed by context
8
+ * (e.g., "mesh.dev"). Example:
9
+ *
10
+ * {
11
+ * "mesh.dev": {
12
+ * "issuer": "https://identity.<env>.<your-platform-domain>",
13
+ * "clientId": "<cli-oidc-client-id>"
14
+ * }
15
+ * }
16
+ *
17
+ * Usage:
18
+ * mesh login mesh.dev — authenticate to mesh dev
19
+ * mesh login mesh.dev --status — show current auth state
20
+ * mesh logout mesh.dev — clear cached credentials
21
+ */
22
+ import { Command } from "commander";
23
+ declare const CONFIG_DIR: string;
24
+ declare const CONFIG_FILE: string;
25
+ declare const CREDENTIALS_FILE: string;
26
+ interface ContextConfig {
27
+ issuer: string;
28
+ clientId: string;
29
+ }
30
+ interface CachedCredentials {
31
+ idToken: string;
32
+ accessToken: string;
33
+ refreshToken?: string;
34
+ expiresAt: string;
35
+ email?: string;
36
+ sub?: string;
37
+ }
38
+ type CredentialsFile = Record<string, CachedCredentials>;
39
+ declare function getContextConfig(context: string): ContextConfig | null;
40
+ declare function readAllCredentials(): CredentialsFile;
41
+ declare function readCredentials(context: string): CachedCredentials | null;
42
+ declare function decodeJwtPayload(token: string): Record<string, unknown>;
43
+ export declare function registerLoginCommand(program: Command): void;
44
+ export { CONFIG_DIR, CONFIG_FILE, CREDENTIALS_FILE };
45
+ export type { ContextConfig, CachedCredentials, CredentialsFile };
46
+ export { readCredentials, readAllCredentials, getContextConfig, decodeJwtPayload };
47
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,QAAA,MAAM,UAAU,QAGf,CAAC;AACF,QAAA,MAAM,WAAW,QAAuC,CAAC;AACzD,QAAA,MAAM,gBAAgB,QAA4C,CAAC;AAWnE,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAGD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAWzD,iBAAS,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAG/D;AAED,iBAAS,kBAAkB,IAAI,eAAe,CAO7C;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAElE;AA4CD,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIhE;AAwQD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C3D;AAMD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * mesh login — Authenticate with Zitadel via OIDC PKCE flow.
3
+ *
4
+ * Opens browser to Zitadel, receives auth code via localhost callback,
5
+ * exchanges for tokens, and caches at ~/.config/mesh/credentials.json.
6
+ *
7
+ * Config is read from ~/.config/mesh/config.json, keyed by context
8
+ * (e.g., "mesh.dev"). Example:
9
+ *
10
+ * {
11
+ * "mesh.dev": {
12
+ * "issuer": "https://identity.<env>.<your-platform-domain>",
13
+ * "clientId": "<cli-oidc-client-id>"
14
+ * }
15
+ * }
16
+ *
17
+ * Usage:
18
+ * mesh login mesh.dev — authenticate to mesh dev
19
+ * mesh login mesh.dev --status — show current auth state
20
+ * mesh logout mesh.dev — clear cached credentials
21
+ */
22
+ import * as http from "http";
23
+ import * as crypto from "crypto";
24
+ import * as fs from "fs";
25
+ import * as path from "path";
26
+ import { execSync } from "child_process";
27
+ import { logError, logInfo, logSuccess, logWarn } from "../utils/log.js";
28
+ // =============================================================================
29
+ // Paths (XDG Base Directory Specification)
30
+ // =============================================================================
31
+ const CONFIG_DIR = path.join(process.env.XDG_CONFIG_HOME ?? path.join(process.env.HOME ?? "~", ".config"), "mesh");
32
+ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
33
+ const CREDENTIALS_FILE = path.join(CONFIG_DIR, "credentials.json");
34
+ const REDIRECT_PORT = 9876;
35
+ const REDIRECT_URI = `http://localhost:${REDIRECT_PORT}/callback`;
36
+ const SCOPES = "openid email profile offline_access urn:zitadel:iam:org:project:id:zitadel:aud";
37
+ function readConfig() {
38
+ if (!fs.existsSync(CONFIG_FILE))
39
+ return {};
40
+ try {
41
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8"));
42
+ }
43
+ catch {
44
+ return {};
45
+ }
46
+ }
47
+ function getContextConfig(context) {
48
+ const config = readConfig();
49
+ return config[context] ?? null;
50
+ }
51
+ function readAllCredentials() {
52
+ if (!fs.existsSync(CREDENTIALS_FILE))
53
+ return {};
54
+ try {
55
+ return JSON.parse(fs.readFileSync(CREDENTIALS_FILE, "utf-8"));
56
+ }
57
+ catch {
58
+ return {};
59
+ }
60
+ }
61
+ function readCredentials(context) {
62
+ return readAllCredentials()[context] ?? null;
63
+ }
64
+ function writeCredentials(context, creds) {
65
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
66
+ const all = readAllCredentials();
67
+ all[context] = creds;
68
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(all, null, 2), {
69
+ mode: 0o600,
70
+ });
71
+ }
72
+ function clearCredentials(context) {
73
+ const all = readAllCredentials();
74
+ delete all[context];
75
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
76
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(all, null, 2), {
77
+ mode: 0o600,
78
+ });
79
+ }
80
+ function base64url(buffer) {
81
+ return buffer.toString("base64url");
82
+ }
83
+ function generateCodeVerifier() {
84
+ return base64url(crypto.randomBytes(32));
85
+ }
86
+ function generateCodeChallenge(verifier) {
87
+ return base64url(crypto.createHash("sha256").update(verifier).digest());
88
+ }
89
+ function decodeJwtPayload(token) {
90
+ const parts = token.split(".");
91
+ if (parts.length !== 3)
92
+ throw new Error("Invalid JWT");
93
+ return JSON.parse(Buffer.from(parts[1], "base64url").toString());
94
+ }
95
+ async function exchangeCode(issuer, clientId, code, codeVerifier) {
96
+ const body = new URLSearchParams({
97
+ grant_type: "authorization_code",
98
+ code,
99
+ redirect_uri: REDIRECT_URI,
100
+ client_id: clientId,
101
+ code_verifier: codeVerifier,
102
+ });
103
+ const resp = await fetch(`${issuer}/oauth/v2/token`, {
104
+ method: "POST",
105
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
106
+ body: body.toString(),
107
+ });
108
+ if (!resp.ok) {
109
+ const text = await resp.text();
110
+ throw new Error(`Token exchange failed (${resp.status}): ${text}`);
111
+ }
112
+ return resp.json();
113
+ }
114
+ async function refreshTokens(issuer, clientId, refreshToken) {
115
+ const body = new URLSearchParams({
116
+ grant_type: "refresh_token",
117
+ refresh_token: refreshToken,
118
+ client_id: clientId,
119
+ });
120
+ const resp = await fetch(`${issuer}/oauth/v2/token`, {
121
+ method: "POST",
122
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
123
+ body: body.toString(),
124
+ });
125
+ if (!resp.ok) {
126
+ throw new Error(`Token refresh failed (${resp.status})`);
127
+ }
128
+ return resp.json();
129
+ }
130
+ // =============================================================================
131
+ // Login Flow
132
+ // =============================================================================
133
+ function login(context, config) {
134
+ return new Promise((resolve, reject) => {
135
+ const codeVerifier = generateCodeVerifier();
136
+ const codeChallenge = generateCodeChallenge(codeVerifier);
137
+ const state = base64url(crypto.randomBytes(16));
138
+ const authUrl = new URL(`${config.issuer}/oauth/v2/authorize`);
139
+ authUrl.searchParams.set("client_id", config.clientId);
140
+ authUrl.searchParams.set("redirect_uri", REDIRECT_URI);
141
+ authUrl.searchParams.set("response_type", "code");
142
+ authUrl.searchParams.set("scope", SCOPES);
143
+ authUrl.searchParams.set("code_challenge", codeChallenge);
144
+ authUrl.searchParams.set("code_challenge_method", "S256");
145
+ authUrl.searchParams.set("state", state);
146
+ const server = http.createServer(async (req, res) => {
147
+ try {
148
+ const url = new URL(req.url ?? "/", `http://localhost:${REDIRECT_PORT}`);
149
+ if (url.pathname !== "/callback") {
150
+ res.writeHead(404);
151
+ res.end("Not found");
152
+ return;
153
+ }
154
+ const error = url.searchParams.get("error");
155
+ if (error) {
156
+ const desc = url.searchParams.get("error_description") ?? error;
157
+ res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
158
+ res.end(`<html><body><h2>Login failed</h2><p>${desc}</p></body></html>`);
159
+ server.close();
160
+ reject(new Error(desc));
161
+ return;
162
+ }
163
+ const returnedState = url.searchParams.get("state");
164
+ if (returnedState !== state) {
165
+ res.writeHead(400);
166
+ res.end("State mismatch");
167
+ server.close();
168
+ reject(new Error("State mismatch"));
169
+ return;
170
+ }
171
+ const code = url.searchParams.get("code");
172
+ if (!code) {
173
+ res.writeHead(400);
174
+ res.end("No code");
175
+ server.close();
176
+ reject(new Error("No authorization code received"));
177
+ return;
178
+ }
179
+ // Exchange code for tokens
180
+ const tokens = await exchangeCode(config.issuer, config.clientId, code, codeVerifier);
181
+ const idPayload = decodeJwtPayload(tokens.id_token);
182
+ const email = idPayload.email ??
183
+ idPayload.preferred_username ??
184
+ "unknown";
185
+ const sub = idPayload.sub;
186
+ // Parse tenants from access token
187
+ // (the Zitadel Action enriches the access token with urn:mesh:tenants)
188
+ let tenants = [];
189
+ try {
190
+ const accessPayload = decodeJwtPayload(tokens.access_token);
191
+ tenants =
192
+ accessPayload["urn:mesh:tenants"] ?? [];
193
+ }
194
+ catch {
195
+ // Access token may be opaque (non-JWT) in some configs
196
+ }
197
+ // Cache credentials
198
+ writeCredentials(context, {
199
+ idToken: tokens.id_token,
200
+ accessToken: tokens.access_token,
201
+ refreshToken: tokens.refresh_token,
202
+ expiresAt: new Date(Date.now() + tokens.expires_in * 1000).toISOString(),
203
+ email,
204
+ sub,
205
+ });
206
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
207
+ res.end(`<html><body><h2>&#x2705; Logged in to ${context}!</h2><p>You can close this tab.</p></body></html>`);
208
+ logSuccess(`Logged in as ${email} (${context})`);
209
+ if (tenants.length > 0) {
210
+ logInfo(`Deployable tenants: ${tenants.join(", ")}`);
211
+ }
212
+ server.close();
213
+ resolve();
214
+ }
215
+ catch (err) {
216
+ server.close();
217
+ reject(err);
218
+ }
219
+ });
220
+ server.listen(REDIRECT_PORT, () => {
221
+ logInfo(`Opening browser for authentication (${context})...`);
222
+ const url = authUrl.toString();
223
+ try {
224
+ if (process.platform === "darwin") {
225
+ execSync(`open "${url}"`, { stdio: "ignore" });
226
+ }
227
+ else if (process.platform === "linux") {
228
+ execSync(`xdg-open "${url}"`, { stdio: "ignore" });
229
+ }
230
+ else {
231
+ logInfo(`Open this URL in your browser:\n${url}`);
232
+ }
233
+ }
234
+ catch {
235
+ logInfo(`Open this URL in your browser:\n${url}`);
236
+ }
237
+ });
238
+ // Timeout after 2 minutes
239
+ setTimeout(() => {
240
+ server.close();
241
+ reject(new Error("Login timed out (2 minutes)"));
242
+ }, 120_000);
243
+ });
244
+ }
245
+ // =============================================================================
246
+ // Status
247
+ // =============================================================================
248
+ async function showStatus(context, config) {
249
+ const creds = readCredentials(context);
250
+ if (!creds) {
251
+ logWarn(`Not logged in to ${context}. Run: mesh login ${context}`);
252
+ process.exit(1);
253
+ }
254
+ const expired = new Date(creds.expiresAt) < new Date();
255
+ if (expired && creds.refreshToken) {
256
+ logInfo("Token expired, attempting refresh...");
257
+ try {
258
+ const tokens = await refreshTokens(config.issuer, config.clientId, creds.refreshToken);
259
+ const idPayload = decodeJwtPayload(tokens.id_token);
260
+ writeCredentials(context, {
261
+ ...creds,
262
+ idToken: tokens.id_token,
263
+ accessToken: tokens.access_token,
264
+ refreshToken: tokens.refresh_token ?? creds.refreshToken,
265
+ expiresAt: new Date(Date.now() + tokens.expires_in * 1000).toISOString(),
266
+ email: idPayload.email ?? creds.email,
267
+ });
268
+ logSuccess(`Token refreshed for ${creds.email ?? "unknown"}`);
269
+ return;
270
+ }
271
+ catch {
272
+ logWarn(`Token expired and refresh failed. Run: mesh login ${context}`);
273
+ process.exit(1);
274
+ }
275
+ }
276
+ if (expired) {
277
+ logWarn(`Token expired at ${creds.expiresAt}. Run: mesh login ${context}`);
278
+ process.exit(1);
279
+ }
280
+ // Parse tenants from access token
281
+ let tenants = [];
282
+ try {
283
+ const accessPayload = decodeJwtPayload(creds.accessToken);
284
+ tenants = accessPayload["urn:mesh:tenants"] ?? [];
285
+ }
286
+ catch {
287
+ // Access token may be opaque
288
+ }
289
+ logSuccess(`Logged in as ${creds.email ?? "unknown"} (${context})`);
290
+ logInfo(`Subject: ${creds.sub}`);
291
+ logInfo(`Expires: ${creds.expiresAt}`);
292
+ if (tenants.length > 0) {
293
+ logInfo(`Deployable tenants: ${tenants.join(", ")}`);
294
+ }
295
+ }
296
+ // =============================================================================
297
+ // Commands
298
+ // =============================================================================
299
+ export function registerLoginCommand(program) {
300
+ program
301
+ .command("login")
302
+ .description("Authenticate with Zitadel (OIDC PKCE)")
303
+ .argument("<context>", 'Platform context (e.g., "mesh.dev")')
304
+ .option("--status", "Show current authentication status")
305
+ .action(async (context, opts) => {
306
+ const config = getContextConfig(context);
307
+ if (!config) {
308
+ logError(`No configuration found for "${context}".\n` +
309
+ `Add it to ${CONFIG_FILE}:\n\n` +
310
+ ` {\n` +
311
+ ` "${context}": {\n` +
312
+ ` "issuer": "https://identity.<env>.<your-platform-domain>",\n` +
313
+ ` "clientId": "<cli-oidc-client-id>"\n` +
314
+ ` }\n` +
315
+ ` }\n`);
316
+ process.exit(1);
317
+ }
318
+ if (opts.status) {
319
+ await showStatus(context, config);
320
+ return;
321
+ }
322
+ try {
323
+ await login(context, config);
324
+ }
325
+ catch (err) {
326
+ logError(`Login failed: ${err.message}`);
327
+ process.exit(1);
328
+ }
329
+ });
330
+ program
331
+ .command("logout")
332
+ .description("Clear cached Zitadel credentials")
333
+ .argument("<context>", 'Platform context (e.g., "mesh.dev")')
334
+ .action((context) => {
335
+ clearCredentials(context);
336
+ logSuccess(`Logged out of ${context}. Credentials cleared.`);
337
+ });
338
+ }
339
+ // =============================================================================
340
+ // Exports (for use by mesh deploy)
341
+ // =============================================================================
342
+ export { CONFIG_DIR, CONFIG_FILE, CREDENTIALS_FILE };
343
+ export { readCredentials, readAllCredentials, getContextConfig, decodeJwtPayload };
344
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEzE,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAEhF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,CAAC,EAC5E,MAAM,CACP,CAAC;AACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAEnE,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,YAAY,GAAG,oBAAoB,aAAa,WAAW,CAAC;AAClE,MAAM,MAAM,GACV,gFAAgF,CAAC;AAuBnF,SAAS,UAAU;IACjB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,kBAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAwB;IACjE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IACrB,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC/D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC/D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAcD,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,OAAO,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAc,EACd,QAAgB,EAChB,IAAY,EACZ,YAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,UAAU,EAAE,oBAAoB;QAChC,IAAI;QACJ,YAAY,EAAE,YAAY;QAC1B,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAA4B,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAc,EACd,QAAgB,EAChB,YAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,UAAU,EAAE,eAAe;QAC3B,aAAa,EAAE,YAAY;QAC3B,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAA4B,CAAC;AAC/C,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,SAAS,KAAK,CAAC,OAAe,EAAE,MAAqB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;QAC/D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACvD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAC1D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,aAAa,EAAE,CAAC,CAAC;gBACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;oBACjC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,GACR,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC;oBACrD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,CACL,uCAAuC,IAAI,oBAAoB,CAChE,CAAC;oBACF,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBACxB,OAAO;gBACT,CAAC;gBAED,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACpD,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;oBAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBAED,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACnB,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;oBACpD,OAAO;gBACT,CAAC;gBAED,2BAA2B;gBAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,EACf,IAAI,EACJ,YAAY,CACb,CAAC;gBACF,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpD,MAAM,KAAK,GACR,SAAS,CAAC,KAAgB;oBAC1B,SAAS,CAAC,kBAA6B;oBACxC,SAAS,CAAC;gBACZ,MAAM,GAAG,GAAG,SAAS,CAAC,GAAa,CAAC;gBAEpC,kCAAkC;gBAClC,uEAAuE;gBACvE,IAAI,OAAO,GAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC5D,OAAO;wBACJ,aAAa,CAAC,kBAAkB,CAAc,IAAI,EAAE,CAAC;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACP,uDAAuD;gBACzD,CAAC;gBAED,oBAAoB;gBACpB,gBAAgB,CAAC,OAAO,EAAE;oBACxB,OAAO,EAAE,MAAM,CAAC,QAAQ;oBACxB,WAAW,EAAE,MAAM,CAAC,YAAY;oBAChC,YAAY,EAAE,MAAM,CAAC,aAAa;oBAClC,SAAS,EAAE,IAAI,IAAI,CACjB,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CACtC,CAAC,WAAW,EAAE;oBACf,KAAK;oBACL,GAAG;iBACJ,CAAC,CAAC;gBAEH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CACL,yCAAyC,OAAO,oDAAoD,CACrG,CAAC;gBAEF,UAAU,CAAC,gBAAgB,KAAK,KAAK,OAAO,GAAG,CAAC,CAAC;gBACjD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,CAAC;gBAED,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE;YAChC,OAAO,CAAC,uCAAuC,OAAO,MAAM,CAAC,CAAC;YAE9D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAClC,QAAQ,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACxC,QAAQ,CAAC,aAAa,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACnD,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,MAAqB;IAErB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,oBAAoB,OAAO,qBAAqB,OAAO,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvD,IAAI,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,EACf,KAAK,CAAC,YAAY,CACnB,CAAC;YACF,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpD,gBAAgB,CAAC,OAAO,EAAE;gBACxB,GAAG,KAAK;gBACR,OAAO,EAAE,MAAM,CAAC,QAAQ;gBACxB,WAAW,EAAE,MAAM,CAAC,YAAY;gBAChC,YAAY,EAAE,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,YAAY;gBACxD,SAAS,EAAE,IAAI,IAAI,CACjB,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CACtC,CAAC,WAAW,EAAE;gBACf,KAAK,EAAG,SAAS,CAAC,KAAgB,IAAI,KAAK,CAAC,KAAK;aAClD,CAAC,CAAC;YACH,UAAU,CAAC,uBAAuB,KAAK,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CACL,qDAAqD,OAAO,EAAE,CAC/D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,oBAAoB,KAAK,CAAC,SAAS,qBAAqB,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kCAAkC;IAClC,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1D,OAAO,GAAI,aAAa,CAAC,kBAAkB,CAAc,IAAI,EAAE,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IAED,UAAU,CAAC,gBAAgB,KAAK,CAAC,KAAK,IAAI,SAAS,KAAK,OAAO,GAAG,CAAC,CAAC;IACpE,OAAO,CAAC,YAAY,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,YAAY,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uCAAuC,CAAC;SACpD,QAAQ,CAAC,WAAW,EAAE,qCAAqC,CAAC;SAC5D,MAAM,CAAC,UAAU,EAAE,oCAAoC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAA0B,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CACN,+BAA+B,OAAO,MAAM;gBAC1C,aAAa,WAAW,OAAO;gBAC/B,OAAO;gBACP,QAAQ,OAAO,QAAQ;gBACvB,oEAAoE;gBACpE,4CAA4C;gBAC5C,SAAS;gBACT,OAAO,CACV,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,iBAAkB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,QAAQ,CAAC,WAAW,EAAE,qCAAqC,CAAC;SAC5D,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE;QAC1B,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC1B,UAAU,CAAC,iBAAiB,OAAO,wBAAwB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,gFAAgF;AAChF,mCAAmC;AACnC,gFAAgF;AAEhF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,20 @@
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 { Command } from "commander";
19
+ export declare function registerRegistryCommands(program: Command): void;
20
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/commands/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqQpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0F/D"}