@atlasauth/cli 0.2.0 → 0.4.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.
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.init = init;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const backend_1 = require("@atlasauth/backend");
7
+ const args_1 = require("../args");
8
+ const errors_1 = require("../errors");
9
+ const output_1 = require("../output");
10
+ const project_1 = require("../project");
11
+ const secrets_1 = require("../secrets");
12
+ const shared_1 = require("./shared");
13
+ /**
14
+ * `atlas init` — set up an Atlas app for a product in one idempotent command.
15
+ *
16
+ * It drives the platform API (a `psk_` platform key) to find or create the app
17
+ * + instance, then the instance's own Backend API to set sign-in strategies,
18
+ * the email sender, the custom domain, a first-party OAuth client and a
19
+ * webhook endpoint. Re-running finds each thing by name / host / URL and only
20
+ * fills what is missing.
21
+ *
22
+ * Every secret it receives goes straight into a 0600 file under
23
+ * `~/.config/<product>/` (directory 0700); stdout carries only public values
24
+ * and file paths. Before anything that would hand back a NEW secret is
25
+ * created, the target file is checked: an existing, different file is refused
26
+ * unless `--force`, so a secret is never minted only to be thrown away.
27
+ */
28
+ const STRATEGY_ALIASES = {
29
+ password: 'password',
30
+ email_code: 'emailCode',
31
+ email_link: 'emailLink',
32
+ passkey: 'passkey',
33
+ phone_code: 'phoneCode',
34
+ username: 'username',
35
+ siwe: 'siwe',
36
+ };
37
+ /** Strategies that need email delivery: turned on only once the instance can send. */
38
+ const EMAIL_STRATEGIES = new Set(['emailCode', 'emailLink']);
39
+ const EMAIL_PROVIDERS = ['resend', 'brevo'];
40
+ function camel(s) {
41
+ return s.replace(/_([a-z])/g, (_m, c) => c.toUpperCase());
42
+ }
43
+ function parseOptions(args) {
44
+ const v = args.values;
45
+ const product = (0, args_1.str)(v, 'product');
46
+ if (!product)
47
+ throw new errors_1.CliError('atlas init requires --product <name>.');
48
+ (0, secrets_1.assertProductName)(product);
49
+ const environment = (0, project_1.parseInstanceEnv)((0, args_1.str)(v, 'instance-env'), 'production');
50
+ const domain = (0, args_1.str)(v, 'domain')?.trim().toLowerCase().replace(/\.$/, '');
51
+ if (domain && !/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/.test(domain)) {
52
+ throw new errors_1.CliError(`--domain must be a domain name like example.com, got '${domain}'.`);
53
+ }
54
+ const emailRaw = (0, args_1.str)(v, 'email') ?? (domain ? 'managed' : 'none');
55
+ if (emailRaw !== 'managed' && emailRaw !== 'development' && emailRaw !== 'none') {
56
+ throw new errors_1.CliError(`--email must be managed, development or none, got '${emailRaw}'.`);
57
+ }
58
+ if (emailRaw === 'managed' && !domain && !(0, args_1.str)(v, 'email-from')) {
59
+ throw new errors_1.CliError('--email managed needs --domain (or --email-from <address on your domain>).');
60
+ }
61
+ if (emailRaw === 'development' && environment !== 'development') {
62
+ throw new errors_1.CliError('--email development is only for --instance-env development. Use --email managed on production.');
63
+ }
64
+ const providerRaw = (0, args_1.str)(v, 'email-provider');
65
+ if (providerRaw !== undefined && !EMAIL_PROVIDERS.includes(providerRaw)) {
66
+ throw new errors_1.CliError(`--email-provider must be ${EMAIL_PROVIDERS.join(' or ')}, got '${providerRaw}'. Configure other providers with PUT /v1/messaging_providers/email.`);
67
+ }
68
+ const emailKeyFile = (0, args_1.str)(v, 'email-key-file');
69
+ if (emailKeyFile !== undefined && !providerRaw)
70
+ throw new errors_1.CliError('--email-key-file needs --email-provider resend|brevo.');
71
+ const strategies = (0, args_1.list)(v, 'strategies').map((s) => STRATEGY_ALIASES[s] ?? camel(s));
72
+ const redirects = (0, args_1.list)(v, 'client-redirect');
73
+ for (const r of redirects) {
74
+ try {
75
+ new URL(r);
76
+ }
77
+ catch {
78
+ throw new errors_1.CliError(`--client-redirect must be an absolute URL, got '${r}'.`);
79
+ }
80
+ }
81
+ return {
82
+ product,
83
+ appName: (0, args_1.str)(v, 'name') || product,
84
+ environment,
85
+ domain,
86
+ authHost: (0, args_1.str)(v, 'auth-host') || (domain ? `auth.${domain}` : undefined),
87
+ strategies,
88
+ email: emailRaw,
89
+ emailFrom: (0, args_1.str)(v, 'email-from') || (emailRaw === 'managed' && domain ? `noreply@mail.${domain}` : undefined),
90
+ emailProvider: providerRaw,
91
+ emailKeyFile,
92
+ redirects,
93
+ webhookUrl: (0, args_1.str)(v, 'webhook-url'),
94
+ force: v.force === true,
95
+ rotateSecret: v['rotate-secret'] === true,
96
+ };
97
+ }
98
+ /** The platform key and API URL: ATLAS_PLATFORM_KEY, else a stored profile holding a psk_ key. */
99
+ function platformAuth(ctx, args) {
100
+ const file = ctx.config.load();
101
+ const profile = (0, args_1.str)(args.values, 'profile') || file.active_profile || 'default';
102
+ const stored = file.profiles[profile];
103
+ const envKey = ctx.env.ATLAS_PLATFORM_KEY?.trim();
104
+ const key = envKey || (stored?.secret_key.startsWith('psk_') ? stored.secret_key : undefined);
105
+ if (!key) {
106
+ throw new errors_1.CliError("atlas init needs a platform key (psk_…). Set ATLAS_PLATFORM_KEY, or store one with 'atlas login --secret-key psk_…'.");
107
+ }
108
+ const apiUrl = ctx.env.ATLAS_API_URL?.trim() || stored?.api_url || backend_1.DEFAULT_API_URL;
109
+ return { secretKey: key, apiUrl };
110
+ }
111
+ const isStatus = (err, status) => err instanceof backend_1.AtlasApiError && err.status === status;
112
+ /**
113
+ * Read the customer's provider key from a file, or stdin with '-'. A bare key,
114
+ * or a dotenv line (`RESEND_API_KEY=re_…`). Never from argv, never printed.
115
+ */
116
+ function readProviderKey(ctx, file) {
117
+ let text;
118
+ try {
119
+ text = ctx.readFile(file === '-' ? '/dev/stdin' : file);
120
+ }
121
+ catch {
122
+ throw new errors_1.CliError(`Could not read the email provider key from ${file === '-' ? 'stdin' : file}.`);
123
+ }
124
+ const line = text.split(/\r?\n/).map((l) => l.trim()).find((l) => l && !l.startsWith('#')) ?? '';
125
+ const m = /^[A-Za-z_][A-Za-z0-9_]*=(.*)$/.exec(line);
126
+ const key = (m ? m[1] : line).trim().replace(/^"(.*)"$/, '$1');
127
+ if (!key || /\s/.test(key))
128
+ throw new errors_1.CliError(`No email provider key found in ${file === '-' ? 'stdin' : file}.`);
129
+ return key;
130
+ }
131
+ /** Refuse up front when a NEW secret would land on an existing, different file. */
132
+ function assertFreeForNewSecret(path, force) {
133
+ if ((0, node_fs_1.existsSync)(path) && !force) {
134
+ throw new errors_1.CliError(`${path} already exists. A new secret would be created and could not be saved there. Move the file aside, or re-run with --force to replace it.`);
135
+ }
136
+ }
137
+ async function init(ctx, args) {
138
+ const opts = parseOptions(args);
139
+ const json = (0, shared_1.wantsJson)(args.values);
140
+ const log = (line) => (json ? ctx.io.err(line) : ctx.io.out(line));
141
+ const dir = (0, secrets_1.productDir)(ctx.env, opts.product);
142
+ const env = opts.environment;
143
+ const secretFile = (0, node_path_1.join)(dir, `${env}.env`);
144
+ const clientFile = (0, node_path_1.join)(dir, `${env}-oauth-client.env`);
145
+ const webhookFile = (0, node_path_1.join)(dir, `${env}-webhook.env`);
146
+ // The plan, then a confirmation unless --yes.
147
+ log(`atlas init: ${opts.appName} (${env})`);
148
+ log(` strategies: ${opts.strategies.length ? opts.strategies.join(', ') : '(instance defaults)'}`);
149
+ log(` email: ${opts.email}${opts.email === 'managed' ? ` from ${opts.emailFrom}` : ''}${opts.emailProvider ? ` (your ${opts.emailProvider} account)` : ''}`);
150
+ if (opts.authHost)
151
+ log(` domain: ${opts.authHost}`);
152
+ if (opts.redirects.length)
153
+ log(` client: first-party OAuth client → ${opts.redirects.join(', ')}`);
154
+ if (opts.webhookUrl)
155
+ log(` webhook: ${opts.webhookUrl}`);
156
+ log(` secrets: ${dir} (0600 files, never printed)`);
157
+ if (args.values.yes !== true) {
158
+ const answer = (await ctx.prompt.text('Proceed? (y/N)')).trim().toLowerCase();
159
+ if (answer !== 'y' && answer !== 'yes')
160
+ throw new errors_1.CliError('Aborted. Nothing was changed.');
161
+ }
162
+ const platform = platformAuth(ctx, args);
163
+ const plat = (0, project_1.httpFor)(ctx, platform);
164
+ // --- 1. app + instance --------------------------------------------------
165
+ const apps = (await plat.get('/v1/platform/apps')).data ?? [];
166
+ let app = apps.find((a) => a.name === opts.appName && a.environment === env);
167
+ let created = false;
168
+ if (!app) {
169
+ assertFreeForNewSecret(secretFile, opts.force);
170
+ const origins = [...new Set(opts.redirects.map((r) => new URL(r).origin).filter((o) => o.startsWith('http')))];
171
+ app = await plat.post('/v1/platform/apps', {
172
+ name: opts.appName,
173
+ environment: env,
174
+ create_development_sibling: false,
175
+ ...(origins.length ? { allowed_origins: origins } : {}),
176
+ });
177
+ created = true;
178
+ (0, secrets_1.writeSecretFile)(dir, `${env}.env`, { ATLAS_SECRET_KEY: app.secret ?? '' }, {
179
+ force: opts.force,
180
+ comment: `Atlas secret key for ${opts.appName} (${env}, ${app.id}). Server-side only.`,
181
+ });
182
+ log(`Created app ${app.id}. Secret key written to ${secretFile}.`);
183
+ }
184
+ else {
185
+ log(`Found app ${app.id}.`);
186
+ }
187
+ let secretKey = (0, secrets_1.readEnvFile)(secretFile)?.ATLAS_SECRET_KEY;
188
+ if (!secretKey) {
189
+ if (!opts.rotateSecret) {
190
+ throw new errors_1.CliError(`App ${app.id} exists but its secret key is not in ${secretFile}. Re-run with --rotate-secret to mint a new one (existing keys keep working for the default overlap window).`);
191
+ }
192
+ const rotated = await plat.post(`/v1/platform/apps/${app.id}/rotate_secret`, {});
193
+ (0, secrets_1.writeSecretFile)(dir, `${env}.env`, { ATLAS_SECRET_KEY: rotated.secret }, {
194
+ force: true,
195
+ comment: `Atlas secret key for ${opts.appName} (${env}, ${app.id}). Server-side only.`,
196
+ });
197
+ secretKey = rotated.secret;
198
+ const until = rotated.previous_keys_expire_at ? new Date(rotated.previous_keys_expire_at).toISOString() : 'now';
199
+ log(`Minted a new secret key into ${secretFile}. Previous keys stop working: ${until}.`);
200
+ }
201
+ const api = (0, project_1.httpFor)(ctx, { secretKey, apiUrl: platform.apiUrl });
202
+ const previous = (0, project_1.readManifest)(ctx.env, opts.product);
203
+ const record = {
204
+ ...(previous?.instances[env] ?? {}),
205
+ instance_id: app.id,
206
+ environment: env,
207
+ publishable_key: app.publishable_key,
208
+ frontend_api_host: app.frontend_api_host,
209
+ issuer: null,
210
+ discovery_url: null,
211
+ jwks_uri: null,
212
+ secret_file: secretFile,
213
+ };
214
+ // --- 2. email sender (before strategies: email methods need it) ----------
215
+ // Always the customer's own provider account: Atlas lends none. The key comes
216
+ // from --email-key-file (or stdin) and is sent once; it is never printed.
217
+ const providerKey = () => {
218
+ if (!opts.emailProvider || !opts.emailKeyFile) {
219
+ throw new errors_1.CliError(`--email ${opts.email} sends through your own email provider. Pass --email-provider resend|brevo and --email-key-file <path> (or - to read it from stdin).`);
220
+ }
221
+ return { transport: opts.emailProvider, config: { api_key: readProviderKey(ctx, opts.emailKeyFile) } };
222
+ };
223
+ let emailReady = opts.email === 'none';
224
+ if (opts.email === 'managed') {
225
+ let managed;
226
+ try {
227
+ managed = await api.get('/v1/messaging_providers/email/managed');
228
+ }
229
+ catch (err) {
230
+ if (!isStatus(err, 404))
231
+ throw err;
232
+ managed = await api.post('/v1/messaging_providers/email/managed', { from_address: opts.emailFrom, ...providerKey() });
233
+ log(`Registered ${opts.emailFrom} on your ${opts.emailProvider} account (managed email).`);
234
+ }
235
+ emailReady = managed.verified;
236
+ record.email = { mode: 'managed', from_address: managed.from_address };
237
+ if (!managed.verified) {
238
+ log('Publish these DNS records for managed email, then run: atlas init again (or POST /v1/messaging_providers/email/managed/verify):');
239
+ for (const r of managed.records ?? []) {
240
+ log(` ${r.type.padEnd(5)} ${r.name} ${r.value}${r.priority !== undefined ? ` (priority ${r.priority})` : ''}`);
241
+ }
242
+ }
243
+ else {
244
+ log(`Managed email verified: ${managed.from_address}.`);
245
+ }
246
+ }
247
+ else if (opts.email === 'development') {
248
+ const providers = await api.get('/v1/messaging_providers');
249
+ let dev;
250
+ if (providers.email?.mode === 'development' && !opts.emailKeyFile) {
251
+ dev = await api.get('/v1/messaging_providers/email/development');
252
+ }
253
+ else if (providers.email && !opts.emailKeyFile) {
254
+ dev = await api.post('/v1/messaging_providers/email/development', {
255
+ provider_id: providers.email.id,
256
+ ...(opts.emailFrom ? { from_address: opts.emailFrom } : {}),
257
+ });
258
+ }
259
+ else {
260
+ dev = await api.post('/v1/messaging_providers/email/development', {
261
+ ...providerKey(),
262
+ ...(opts.emailFrom ? { from_address: opts.emailFrom } : {}),
263
+ });
264
+ }
265
+ emailReady = dev.active;
266
+ record.email = { mode: 'development', from_address: dev.from_address };
267
+ log(`Development email sender on: your provider, from ${dev.from_address} (capped, development instances only).`);
268
+ if (dev.note)
269
+ log(` Note: ${dev.note}`);
270
+ }
271
+ else {
272
+ record.email = { mode: 'none' };
273
+ }
274
+ // --- 3. strategies --------------------------------------------------------
275
+ if (opts.strategies.length) {
276
+ const current = (await api.get('/v1/instance')).auth_config_resolved?.strategies ?? {};
277
+ const missing = opts.strategies.filter((s) => current[s] !== true);
278
+ const enableNow = missing.filter((s) => !EMAIL_STRATEGIES.has(s) || emailReady);
279
+ const later = missing.filter((s) => EMAIL_STRATEGIES.has(s) && !emailReady);
280
+ if (enableNow.length) {
281
+ try {
282
+ await api.patch('/v1/instance', { auth_config: { strategies: Object.fromEntries(enableNow.map((s) => [s, true])) } });
283
+ log(`Turned on: ${enableNow.join(', ')}.`);
284
+ }
285
+ catch (err) {
286
+ // Password sign-up with email verification also needs a sender: say so, keep going.
287
+ if (!(err instanceof backend_1.AtlasApiError && err.status === 422 && err.code === 'EMAIL_PROVIDER_REQUIRED'))
288
+ throw err;
289
+ log(`Not turned on yet: ${err.message} Re-run atlas init once email can be sent.`);
290
+ }
291
+ }
292
+ if (later.length) {
293
+ log(`Not turned on yet (the instance cannot send email until the sender is ready): ${later.join(', ')}. Re-run atlas init once it is.`);
294
+ }
295
+ }
296
+ // --- 4. custom domain ------------------------------------------------------
297
+ if (opts.authHost) {
298
+ const domains = (await api.get('/v1/domains')).data ?? [];
299
+ let d = domains.find((x) => x.host === opts.authHost);
300
+ if (!d) {
301
+ d = await api.post('/v1/domains', { host: opts.authHost, role: 'fapi' });
302
+ log(`Added custom domain ${opts.authHost}.`);
303
+ }
304
+ record.custom_domain = { host: d.host, cname_target: d.cname_target, status: d.status };
305
+ if (!d.live && d.cname_target) {
306
+ log(`Publish this DNS record for the sign-in domain: CNAME ${d.host} → ${d.cname_target} (DNS only, not proxied).`);
307
+ }
308
+ }
309
+ // --- 5. first-party OAuth client -----------------------------------------
310
+ if (opts.redirects.length) {
311
+ const clientName = `${opts.appName} (${env})`;
312
+ const clients = (await api.get('/v1/oauth_clients')).data ?? [];
313
+ const existing = clients.find((c) => c.name === clientName);
314
+ if (existing) {
315
+ const missingUris = opts.redirects.filter((r) => !existing.redirect_uris.includes(r));
316
+ if (missingUris.length) {
317
+ await api.patch(`/v1/oauth_clients/${existing.id}`, { redirect_uris: [...existing.redirect_uris, ...missingUris] });
318
+ log(`Added redirect URIs to OAuth client ${existing.client_id}: ${missingUris.join(', ')}.`);
319
+ }
320
+ else {
321
+ log(`Found OAuth client ${existing.client_id}.`);
322
+ }
323
+ const hasSecret = Boolean((0, secrets_1.readEnvFile)(clientFile)?.ATLAS_CLIENT_SECRET);
324
+ if (!hasSecret)
325
+ log(`Its secret is not in ${clientFile}. Mint one with: atlas client rotate ${existing.id} --product ${opts.product} --instance-env ${env}`);
326
+ record.oauth_client = {
327
+ id: existing.id,
328
+ client_id: existing.client_id,
329
+ redirect_uris: [...new Set([...existing.redirect_uris, ...missingUris])],
330
+ secret_file: hasSecret ? clientFile : null,
331
+ };
332
+ }
333
+ else {
334
+ assertFreeForNewSecret(clientFile, opts.force);
335
+ const c = await api.post('/v1/oauth_clients', {
336
+ name: clientName,
337
+ redirect_uris: opts.redirects,
338
+ first_party: true,
339
+ });
340
+ if (c.client_secret) {
341
+ (0, secrets_1.writeSecretFile)(dir, `${env}-oauth-client.env`, { ATLAS_CLIENT_ID: c.client_id, ATLAS_CLIENT_SECRET: c.client_secret }, {
342
+ force: opts.force,
343
+ comment: `OAuth client ${c.id} for ${opts.appName} (${env}). Server-side only.`,
344
+ });
345
+ }
346
+ record.oauth_client = { id: c.id, client_id: c.client_id, redirect_uris: c.redirect_uris, secret_file: c.client_secret ? clientFile : null };
347
+ log(`Created first-party OAuth client ${c.client_id}. Secret written to ${clientFile}.`);
348
+ }
349
+ }
350
+ // --- 6. webhook endpoint ---------------------------------------------------
351
+ if (opts.webhookUrl) {
352
+ const hooks = (await api.get('/v1/webhook_endpoints')).data ?? [];
353
+ const existing = hooks.find((h) => h.url === opts.webhookUrl);
354
+ if (existing) {
355
+ const hasSecret = Boolean((0, secrets_1.readEnvFile)(webhookFile)?.ATLAS_WEBHOOK_SECRET);
356
+ record.webhook = { id: existing.id, url: existing.url, secret_file: hasSecret ? webhookFile : null };
357
+ log(`Found webhook endpoint ${existing.id}.`);
358
+ }
359
+ else {
360
+ assertFreeForNewSecret(webhookFile, opts.force);
361
+ const h = await api.post('/v1/webhook_endpoints', { url: opts.webhookUrl });
362
+ if (h.secret) {
363
+ (0, secrets_1.writeSecretFile)(dir, `${env}-webhook.env`, { ATLAS_WEBHOOK_SECRET: h.secret }, {
364
+ force: opts.force,
365
+ comment: `Signing secret for webhook endpoint ${h.id} (${opts.webhookUrl}).`,
366
+ });
367
+ }
368
+ record.webhook = { id: h.id, url: h.url, secret_file: h.secret ? webhookFile : null };
369
+ log(`Created webhook endpoint ${h.id}. Signing secret written to ${webhookFile}.`);
370
+ }
371
+ }
372
+ // --- 7. public endpoints, manifest, summary ----------------------------------
373
+ const inst = await api.get('/v1/instance').catch(() => undefined);
374
+ const host = inst?.frontend_api_host ?? app.frontend_api_host;
375
+ const base = host ? `https://${host}` : null;
376
+ record.publishable_key = inst?.publishable_key ?? app.publishable_key;
377
+ record.frontend_api_host = host ?? null;
378
+ record.issuer = inst?.issuer ?? app.issuer ?? base;
379
+ record.discovery_url = inst?.discovery_url ?? app.discovery_url ?? (record.issuer ? `${record.issuer}/.well-known/openid-configuration` : null);
380
+ record.jwks_uri = inst?.jwks_uri ?? app.jwks_uri ?? (base ? `${base}/.well-known/jwks.json` : null);
381
+ const manifest = {
382
+ product: opts.product,
383
+ api_url: platform.apiUrl,
384
+ instances: { ...(previous?.instances ?? {}), [env]: record },
385
+ };
386
+ const manifestFile = (0, project_1.writeManifest)(ctx.env, manifest);
387
+ if (json) {
388
+ (0, output_1.printJson)(ctx.io, { created, manifest: manifestFile, ...record });
389
+ return 0;
390
+ }
391
+ ctx.io.out('');
392
+ ctx.io.out(`Done. ${created ? 'Created' : 'Updated'} ${opts.appName} (${env}).`);
393
+ ctx.io.out(` Instance: ${record.instance_id}`);
394
+ ctx.io.out(` Publishable key: ${record.publishable_key}`);
395
+ ctx.io.out(` Frontend API: ${base ?? '(not assigned)'}`);
396
+ ctx.io.out(` Issuer: ${record.issuer ?? '(unknown)'}`);
397
+ ctx.io.out(` Discovery: ${record.discovery_url ?? '(unknown)'}`);
398
+ if (record.oauth_client)
399
+ ctx.io.out(` OAuth client id: ${record.oauth_client.client_id}`);
400
+ ctx.io.out(` Secret key file: ${secretFile}`);
401
+ if (record.oauth_client?.secret_file)
402
+ ctx.io.out(` Client secret file: ${record.oauth_client.secret_file}`);
403
+ if (record.webhook?.secret_file)
404
+ ctx.io.out(` Webhook secret file: ${record.webhook.secret_file}`);
405
+ ctx.io.out(` Project manifest: ${manifestFile}`);
406
+ ctx.io.out(`Next: atlas preflight --product ${opts.product} --instance-env ${env}, and atlas env --product ${opts.product} --format dotenv`);
407
+ return 0;
408
+ }
409
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ParsedArgs } from '../args';
2
+ import type { RunContext } from '../context';
3
+ import { type ProjectInstance, type ProjectManifest } from '../project';
4
+ /**
5
+ * The project commands that sit beside `atlas init`: `preflight` (a CI gate),
6
+ * `env` (deploy variables without secrets) and `client rotate` (a new OAuth
7
+ * client secret, written straight to its file).
8
+ */
9
+ /**
10
+ * The instance credential a project command runs with:
11
+ * - `--instance <id>`: the instance's secret file from a project manifest;
12
+ * - `--product <name>` [`--instance-env`]: that project's instance;
13
+ * - otherwise the profile / ATLAS_SECRET_KEY, as every other command.
14
+ */
15
+ export declare function instanceCredential(ctx: RunContext, args: ParsedArgs): {
16
+ secretKey: string;
17
+ apiUrl: string;
18
+ manifest?: ProjectManifest;
19
+ instance?: ProjectInstance;
20
+ };
21
+ /** `atlas preflight` — run the instance's setup checks; exit 1 on errors (or warnings with --fail-on warning). */
22
+ export declare function preflight(ctx: RunContext, args: ParsedArgs): Promise<number>;
23
+ /** Public values, then each secret as a reference to its file — never the value. */
24
+ export declare function envCommand(ctx: RunContext, args: ParsedArgs): Promise<number>;
25
+ /** `atlas client rotate <id> [--now | --overlap <seconds>]` — the new secret goes straight to its file. */
26
+ export declare function client(ctx: RunContext, args: ParsedArgs): Promise<number>;