@atlasauth/cli 0.8.0 → 0.10.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 (56) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/args.d.ts +146 -0
  3. package/dist/args.js +63 -1
  4. package/dist/args.js.map +1 -1
  5. package/dist/commands/auth.js +5 -1
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/config.d.ts +15 -0
  8. package/dist/commands/config.js +76 -6
  9. package/dist/commands/config.js.map +1 -1
  10. package/dist/commands/csp.d.ts +32 -0
  11. package/dist/commands/csp.js +180 -0
  12. package/dist/commands/csp.js.map +1 -0
  13. package/dist/commands/info.js +1 -1
  14. package/dist/commands/info.js.map +1 -1
  15. package/dist/commands/init.js +26 -2
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/integrations.d.ts +8 -0
  18. package/dist/commands/integrations.js +112 -0
  19. package/dist/commands/integrations.js.map +1 -0
  20. package/dist/commands/listen.d.ts +17 -0
  21. package/dist/commands/listen.js +223 -0
  22. package/dist/commands/listen.js.map +1 -0
  23. package/dist/commands/move-origin.d.ts +11 -0
  24. package/dist/commands/move-origin.js +95 -0
  25. package/dist/commands/move-origin.js.map +1 -0
  26. package/dist/commands/operator.d.ts +26 -0
  27. package/dist/commands/operator.js +210 -0
  28. package/dist/commands/operator.js.map +1 -0
  29. package/dist/commands/partner-platforms.d.ts +10 -0
  30. package/dist/commands/partner-platforms.js +157 -0
  31. package/dist/commands/partner-platforms.js.map +1 -0
  32. package/dist/commands/project-commands.d.ts +12 -0
  33. package/dist/commands/project-commands.js +130 -30
  34. package/dist/commands/project-commands.js.map +1 -1
  35. package/dist/commands/referrals.d.ts +4 -4
  36. package/dist/commands/referrals.js +203 -33
  37. package/dist/commands/referrals.js.map +1 -1
  38. package/dist/commands/shared.d.ts +6 -0
  39. package/dist/commands/shared.js +10 -1
  40. package/dist/commands/shared.js.map +1 -1
  41. package/dist/commands/status.d.ts +3 -0
  42. package/dist/commands/status.js +77 -0
  43. package/dist/commands/status.js.map +1 -0
  44. package/dist/commands/webhooks.d.ts +29 -2
  45. package/dist/commands/webhooks.js +257 -24
  46. package/dist/commands/webhooks.js.map +1 -1
  47. package/dist/config.d.ts +14 -0
  48. package/dist/config.js.map +1 -1
  49. package/dist/context.d.ts +5 -0
  50. package/dist/context.js.map +1 -1
  51. package/dist/help.d.ts +1 -1
  52. package/dist/help.js +202 -16
  53. package/dist/help.js.map +1 -1
  54. package/dist/run.js +16 -0
  55. package/dist/run.js.map +1 -1
  56. package/package.json +5 -3
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deviceLogin = deviceLogin;
4
+ exports.token = token;
5
+ exports.keys = keys;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ const backend_1 = require("@atlasauth/backend");
9
+ const args_1 = require("../args");
10
+ const errors_1 = require("../errors");
11
+ const output_1 = require("../output");
12
+ const shared_1 = require("./shared");
13
+ /**
14
+ * `atlas login --device` — sign in as an OPERATOR through Atlas's own sign-in
15
+ * (passkey, MFA) with the OAuth device flow, instead of pasting a key. Only
16
+ * short-lived tokens are stored: the operator token (to swap later with
17
+ * `atlas token`) and, with `--resource`, a one-hour token bound to that
18
+ * instance or app, used as the profile credential. No long-lived key is written.
19
+ */
20
+ async function deviceLogin(ctx, args) {
21
+ const { values } = args;
22
+ const profile = (0, args_1.str)(values, 'profile') || 'default';
23
+ const apiUrl = (0, args_1.str)(values, 'url') || (0, shared_1.envApiUrl)(ctx.env) || backend_1.DEFAULT_API_URL;
24
+ const opts = { apiUrl, fetch: ctx.fetch };
25
+ // --audience <id>: an operator token FOR another product that trusts Atlas's
26
+ // operator issuer (one of /v1/operator `audiences`). It is printed, not
27
+ // stored: Atlas's own token exchange refuses it.
28
+ const audience = (0, args_1.str)(values, 'audience');
29
+ let start;
30
+ try {
31
+ start = await (0, backend_1.startOperatorLogin)({ ...opts, ...(audience ? { audience } : {}) });
32
+ }
33
+ catch (err) {
34
+ throw new errors_1.CliError(err instanceof Error ? err.message : String(err));
35
+ }
36
+ ctx.io.out(`Open ${start.verification_uri_complete}`);
37
+ ctx.io.out(`and confirm the code ${start.user_code} (it expires in ${Math.round(start.expires_in / 60)} minutes).`);
38
+ let token;
39
+ try {
40
+ token = await (0, backend_1.pollOperatorLogin)(start, { fetch: ctx.fetch, sleep: ctx.sleep });
41
+ }
42
+ catch (err) {
43
+ if (err instanceof backend_1.OAuthFlowError)
44
+ throw new errors_1.CliError(`Sign-in did not complete: ${err.message}`);
45
+ throw err;
46
+ }
47
+ if (audience) {
48
+ if ((0, shared_1.wantsJson)(values))
49
+ (0, output_1.printJson)(ctx.io, { ...token, audience, issuer: start.config.issuer });
50
+ else
51
+ ctx.io.out(token.access_token);
52
+ ctx.io.err(`An operator token for ${audience} (expires in ${Math.round(token.expires_in / 60)} minutes). Hand it to that product; it is not stored.`);
53
+ return 0;
54
+ }
55
+ const now = Date.now();
56
+ const file = ctx.config.load();
57
+ const entry = file.profiles[profile] ?? { api_url: apiUrl, secret_key: '' };
58
+ entry.api_url = apiUrl;
59
+ entry.operator = { access_token: token.access_token, expires_at: now + token.expires_in * 1000, issuer: start.config.issuer };
60
+ const resource = (0, args_1.str)(values, 'resource');
61
+ if (resource) {
62
+ const scope = (0, args_1.str)(values, 'scope') || 'read';
63
+ const bound = await exchangeOrExplain(token.access_token, resource, scope, opts);
64
+ entry.secret_key = bound.access_token;
65
+ entry.expires_at = now + bound.expires_in * 1000;
66
+ entry.resource = resource;
67
+ entry.scope = bound.scope;
68
+ }
69
+ file.profiles[profile] = entry;
70
+ file.active_profile = profile;
71
+ ctx.config.save(file);
72
+ ctx.io.out(`Signed in to ${start.config.issuer} as an operator (profile '${profile}').`);
73
+ if (resource)
74
+ ctx.io.out(`Profile credential: a one-hour token for ${resource} (${entry.scope}).`);
75
+ else
76
+ ctx.io.out("Run 'atlas token --resource <ins_… | app_…> --scope <scopes>' for a token bound to one instance or app.");
77
+ return 0;
78
+ }
79
+ async function exchangeOrExplain(subject, resource, scope, opts) {
80
+ try {
81
+ return await (0, backend_1.exchangeOperatorToken)(subject, { resource, scope }, opts);
82
+ }
83
+ catch (err) {
84
+ if (err instanceof backend_1.OAuthFlowError)
85
+ throw new errors_1.CliError(`Token exchange refused (${err.error}): ${err.message}`);
86
+ throw err;
87
+ }
88
+ }
89
+ /**
90
+ * `atlas token --resource <ins_…|app_…|acct_…> --scope "<scopes>"` — swap the
91
+ * stored operator token for a one-hour Atlas token bound to that resource.
92
+ * Prints the token (or JSON with --json); `--profile` stores it as that
93
+ * profile's credential instead.
94
+ */
95
+ async function token(ctx, args) {
96
+ const { values } = args;
97
+ const file = ctx.config.load();
98
+ const profileName = (0, args_1.str)(values, 'profile') || file.active_profile || 'default';
99
+ const profile = file.profiles[profileName];
100
+ if (!profile?.operator || profile.operator.expires_at <= Date.now()) {
101
+ throw new errors_1.CliError("No current operator sign-in. Run 'atlas login --device' first.");
102
+ }
103
+ const resource = (0, args_1.str)(values, 'resource');
104
+ if (!resource)
105
+ throw new errors_1.CliError('--resource is required (an ins_…, app_… or acct_… id).');
106
+ const scope = (0, args_1.str)(values, 'scope') || 'read';
107
+ const bound = await exchangeOrExplain(profile.operator.access_token, resource, scope, { apiUrl: profile.api_url, fetch: ctx.fetch });
108
+ if ((0, shared_1.wantsJson)(values)) {
109
+ (0, output_1.printJson)(ctx.io, bound);
110
+ return 0;
111
+ }
112
+ ctx.io.out(bound.access_token);
113
+ return 0;
114
+ }
115
+ /** Write a secret to a 0600 file (directories 0700). */
116
+ function writeSecret(path, name, secret) {
117
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true, mode: 0o700 });
118
+ (0, node_fs_1.writeFileSync)(path, `${name}=${secret}\n`, { mode: 0o600 });
119
+ (0, node_fs_1.chmodSync)(path, 0o600);
120
+ }
121
+ /**
122
+ * `atlas keys whoami|list|create|rotate|revoke|revoke-leaked`.
123
+ *
124
+ * create / rotate ask for the new secret SEALED to a key pair generated here
125
+ * (X-Secret-Recipient), open it locally and write it to a 0600 file
126
+ * (`--out`, default `.atlas/secret-key-<id>.env`), so the plaintext never
127
+ * crosses a log or terminal. `--print-secret` prints it instead.
128
+ */
129
+ async function keys(ctx, args) {
130
+ const { values, positionals } = args;
131
+ const sub = positionals[1];
132
+ if (sub === 'revoke-leaked') {
133
+ const secret = positionals[2] ?? (await ctx.prompt.secret('Leaked secret'));
134
+ if (!secret)
135
+ throw new errors_1.CliError('Pass the leaked secret (or enter it at the prompt).');
136
+ const apiUrl = (0, args_1.str)(values, 'url') || (0, shared_1.envApiUrl)(ctx.env) || backend_1.DEFAULT_API_URL;
137
+ const res = await (0, backend_1.revokeLeakedKeys)([secret], { apiUrl, fetch: ctx.fetch });
138
+ ctx.io.out(`Result: ${res.results[0]?.outcome ?? 'unknown'}`);
139
+ return 0;
140
+ }
141
+ const auth = (0, shared_1.resolveAuth)(ctx, values);
142
+ const pair = (0, backend_1.generateSealKeyPair)();
143
+ const atlas = (0, backend_1.createAtlasClient)({ secretKey: auth.secretKey, apiUrl: auth.apiUrl, fetch: ctx.fetch, secretRecipient: pair.secretRecipient });
144
+ const emit = (data, line) => ((0, shared_1.wantsJson)(values) ? (0, output_1.printJson)(ctx.io, data) : line());
145
+ const deliver = (id, sealed, plain) => {
146
+ const secret = sealed ? (0, backend_1.openSealedSecret)(sealed, pair) : plain;
147
+ if (!secret)
148
+ throw new errors_1.CliError('The response carried no secret.');
149
+ if (values['print-secret'] === true)
150
+ return ctx.io.out(secret);
151
+ const path = (0, args_1.str)(values, 'out') || `.atlas/secret-key-${id}.env`;
152
+ writeSecret(path, 'ATLAS_SECRET_KEY', secret);
153
+ ctx.io.out(`Secret written to ${path} (mode 0600).`);
154
+ };
155
+ switch (sub) {
156
+ case 'whoami': {
157
+ const me = await atlas.whoami();
158
+ emit(me, () => {
159
+ ctx.io.out(`Key: ${me.key.id} (${me.key.type}, ${me.key.prefix ?? ''}…)`);
160
+ ctx.io.out(`Scopes: ${me.key.scopes.join(' ')}`);
161
+ ctx.io.out(`Instance: ${me.instance?.id ?? '-'} Account: ${me.account.id ?? '-'}`);
162
+ if (me.key.expires_at)
163
+ ctx.io.out(`Expires: ${new Date(me.key.expires_at).toISOString()}`);
164
+ });
165
+ return 0;
166
+ }
167
+ case 'list': {
168
+ const page = await atlas.keys.list();
169
+ emit(page, () => {
170
+ for (const k of page.data) {
171
+ ctx.io.out(`${k.id} ${k.kind.padEnd(14)} ${k.prefix.padEnd(20)} ${k.status.padEnd(9)} owner=${k.owner ?? '-'} last_used=${k.last_used_at ? new Date(k.last_used_at).toISOString() : 'never'}`);
172
+ }
173
+ });
174
+ return 0;
175
+ }
176
+ case 'create': {
177
+ const scopes = ((0, args_1.str)(values, 'scopes') || '').split(/[ ,]+/).filter(Boolean);
178
+ if (scopes.length === 0)
179
+ throw new errors_1.CliError('--scopes is required, e.g. --scopes "instance:read webhooks:read" or --scopes read_only.');
180
+ const created = await atlas.secretKeys.create({
181
+ scopes,
182
+ name: (0, args_1.str)(values, 'name') || undefined,
183
+ owner: (0, args_1.str)(values, 'owner') || undefined,
184
+ expires_at: (0, args_1.str)(values, 'expires-at') || undefined,
185
+ allowed_ips: (0, args_1.str)(values, 'allowed-ips') ? ((0, args_1.str)(values, 'allowed-ips') ?? '').split(',').map((s) => s.trim()) : undefined,
186
+ });
187
+ ctx.io.out(`Created ${created.id} (${created.prefix}…) with ${created.scopes.join(' ')}.`);
188
+ deliver(created.id, created.sealed_secret, created.secret);
189
+ return 0;
190
+ }
191
+ case 'rotate': {
192
+ const id = (0, shared_1.requireArg)(positionals, 2, 'key id');
193
+ const overlap = (0, args_1.str)(values, 'overlap');
194
+ const rotated = await atlas.secretKeys.rotate(id, overlap ? { overlap_seconds: Number(overlap) } : {});
195
+ ctx.io.out(`Rotated ${id} → ${rotated.id}.` +
196
+ (rotated.previous_key_expires_at ? ` The old key works until ${new Date(rotated.previous_key_expires_at).toISOString()}.` : ' The old key was revoked.'));
197
+ deliver(rotated.id, rotated.sealed_secret, rotated.secret);
198
+ return 0;
199
+ }
200
+ case 'revoke': {
201
+ const id = (0, shared_1.requireArg)(positionals, 2, 'key id');
202
+ await atlas.secretKeys.revoke(id);
203
+ ctx.io.out(`Revoked ${id}.`);
204
+ return 0;
205
+ }
206
+ default:
207
+ throw new errors_1.CliError('Usage: atlas keys whoami|list|create|rotate <id>|revoke <id>|revoke-leaked [secret]');
208
+ }
209
+ }
210
+ //# sourceMappingURL=operator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator.js","sourceRoot":"","sources":["../../src/commands/operator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ParsedArgs } from '../args';
2
+ import type { RunContext } from '../context';
3
+ /**
4
+ * `atlas partner-platforms list | get <partner> | set <partner> | registration <partner>
5
+ * | token <partner> | deliveries <partner> | remove <partner>`: this instance as a
6
+ * partner platform of another product (cookiemunch is a preset). The partner
7
+ * token is read from a file or stdin (`--token-file <path|->`) or
8
+ * `ATLAS_PARTNER_TOKEN`, sent once and never printed.
9
+ */
10
+ export declare function partnerPlatforms(ctx: RunContext, args: ParsedArgs): Promise<number>;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.partnerPlatforms = partnerPlatforms;
4
+ const args_1 = require("../args");
5
+ const errors_1 = require("../errors");
6
+ const output_1 = require("../output");
7
+ const project_1 = require("../project");
8
+ const shared_1 = require("./shared");
9
+ const COLUMNS = [
10
+ { header: 'PARTNER', get: (p) => p.partner },
11
+ { header: 'STATUS', get: (p) => (p.enabled ? 'on' : 'off') },
12
+ { header: 'TOKEN', get: (p) => (p.token_set ? 'stored' : 'not stored') },
13
+ { header: 'RECEIVER', get: (p) => p.receiver_url },
14
+ { header: 'LAST DELIVERY', get: (p) => (p.last_delivery_at ? (0, output_1.fmtTime)(p.last_delivery_at) : '') },
15
+ ];
16
+ const DELIVERY_COLUMNS = [
17
+ { header: 'WHEN', get: (d) => (0, output_1.fmtTime)(d.received_at) },
18
+ { header: 'EVENT', get: (d) => d.event_type ?? '' },
19
+ { header: 'OUTCOME', get: (d) => d.outcome },
20
+ { header: 'USER', get: (d) => d.user_id ?? '' },
21
+ ];
22
+ /** The first non-comment line of a file (or stdin), `NAME=value` or a bare value. */
23
+ function readTokenFile(ctx, file) {
24
+ let text;
25
+ try {
26
+ text = ctx.readFile(file === '-' ? '/dev/stdin' : file);
27
+ }
28
+ catch {
29
+ throw new errors_1.CliError(`Could not read the partner token from ${file === '-' ? 'stdin' : file}.`);
30
+ }
31
+ const line = text.split(/\r?\n/).map((l) => l.trim()).find((l) => l && !l.startsWith('#')) ?? '';
32
+ const m = /^[A-Za-z_][A-Za-z0-9_]*=(.*)$/.exec(line);
33
+ const token = (m ? m[1] : line).trim().replace(/^"(.*)"$/, '$1');
34
+ if (!token || /\s/.test(token))
35
+ throw new errors_1.CliError(`No partner token found in ${file === '-' ? 'stdin' : file}.`);
36
+ return token;
37
+ }
38
+ /**
39
+ * `atlas partner-platforms list | get <partner> | set <partner> | registration <partner>
40
+ * | token <partner> | deliveries <partner> | remove <partner>`: this instance as a
41
+ * partner platform of another product (cookiemunch is a preset). The partner
42
+ * token is read from a file or stdin (`--token-file <path|->`) or
43
+ * `ATLAS_PARTNER_TOKEN`, sent once and never printed.
44
+ */
45
+ async function partnerPlatforms(ctx, args) {
46
+ const sub = args.positionals[1];
47
+ const partner = args.positionals[2];
48
+ const json = (0, shared_1.wantsJson)(args.values);
49
+ const http = () => {
50
+ const auth = (0, shared_1.resolveAuth)(ctx, args.values);
51
+ return (0, project_1.httpFor)(ctx, { secretKey: auth.secretKey, apiUrl: auth.apiUrl });
52
+ };
53
+ const path = (p, rest = '') => `/v1/partner_platforms/${encodeURIComponent(p)}${rest}`;
54
+ const needPartner = () => {
55
+ if (!partner)
56
+ throw new errors_1.CliError(`partner-platforms ${sub} needs a partner id (a preset such as cookiemunch, or your own id).`);
57
+ return partner;
58
+ };
59
+ switch (sub) {
60
+ case 'list': {
61
+ const page = await http().get('/v1/partner_platforms');
62
+ if (json)
63
+ (0, output_1.printJson)(ctx.io, page);
64
+ else
65
+ ctx.io.out((0, output_1.renderTable)(COLUMNS, page.data));
66
+ return 0;
67
+ }
68
+ case 'get': {
69
+ (0, output_1.printJson)(ctx.io, await http().get(path(needPartner())));
70
+ return 0;
71
+ }
72
+ case 'set': {
73
+ const target = needPartner();
74
+ const body = {};
75
+ const platformId = (0, args_1.str)(args.values, 'platform-id');
76
+ if (platformId)
77
+ body.platform_id = platformId;
78
+ const jwks = (0, args_1.str)(args.values, 'jwks-url');
79
+ if (jwks)
80
+ body.jwks_url = jwks;
81
+ const header = (0, args_1.str)(args.values, 'signature-header');
82
+ if (header)
83
+ body.signature_header = header;
84
+ const sources = (0, args_1.list)(args.values, 'allowed-source');
85
+ if (sources.length)
86
+ body.allowed_sources = sources;
87
+ if (args.values.disable === true)
88
+ body.enabled = false;
89
+ const saved = await http().put(path(target), body);
90
+ if (json)
91
+ (0, output_1.printJson)(ctx.io, saved);
92
+ else
93
+ ctx.io.out(`Saved ${saved.partner}: ${saved.enabled ? 'on' : 'off'}, receiver ${saved.receiver_url}. Next: atlas partner-platforms registration ${saved.partner}`);
94
+ return 0;
95
+ }
96
+ case 'registration': {
97
+ const details = await http().get(path(needPartner(), '/registration'));
98
+ if (json) {
99
+ (0, output_1.printJson)(ctx.io, details);
100
+ return 0;
101
+ }
102
+ ctx.io.out([
103
+ `Send ${details.send_to ? details.send_to.contact : 'the partner'} these details:`,
104
+ ` platform id: ${details.platform_id}`,
105
+ ` receiver URL: ${details.receiver_url}${details.receiver_url_is_template ? ' ({externalId} = the Atlas instance id)' : ''}`,
106
+ ` events: ${details.events.join(', ')}`,
107
+ ` signature: ${details.signature.header}: ${details.signature.format}`,
108
+ ` key set: ${details.signature.jwks_url} (tolerance ${details.signature.tolerance_seconds}s)`,
109
+ ...(details.send_to ? [` docs: ${details.send_to.docs}`] : []),
110
+ `Then store the token it hands back: atlas partner-platforms token ${details.partner} --token-file -`,
111
+ ].join('\n'));
112
+ return 0;
113
+ }
114
+ case 'token': {
115
+ const target = needPartner();
116
+ const file = (0, args_1.str)(args.values, 'token-file');
117
+ const token = file ? readTokenFile(ctx, file) : ctx.env.ATLAS_PARTNER_TOKEN?.trim();
118
+ if (!token) {
119
+ throw new errors_1.CliError('Pass the partner token with --token-file <path|-> (or ATLAS_PARTNER_TOKEN). It is stored encrypted and never shown again.');
120
+ }
121
+ const apiBase = (0, args_1.str)(args.values, 'base-url');
122
+ const saved = await http().post(path(target, '/token'), {
123
+ token,
124
+ ...(args.values.rotate === true ? { rotate: true } : {}),
125
+ ...(apiBase ? { api_base_url: apiBase } : {}),
126
+ });
127
+ if (json)
128
+ (0, output_1.printJson)(ctx.io, saved);
129
+ else
130
+ ctx.io.out(`Stored the ${saved.name} partner token (encrypted; it is never shown again).`);
131
+ return 0;
132
+ }
133
+ case 'deliveries': {
134
+ const lim = (0, args_1.str)(args.values, 'limit');
135
+ const page = await http().get(path(needPartner(), `/deliveries${lim ? `?limit=${encodeURIComponent(lim)}` : ''}`));
136
+ if (json)
137
+ (0, output_1.printJson)(ctx.io, page);
138
+ else
139
+ ctx.io.out((0, output_1.renderTable)(DELIVERY_COLUMNS, page.data));
140
+ return 0;
141
+ }
142
+ case 'remove': {
143
+ const target = needPartner();
144
+ await http().delete(path(target));
145
+ if (json)
146
+ (0, output_1.printJson)(ctx.io, { partner: target, removed: true });
147
+ else
148
+ ctx.io.out(`Removed ${target} and its stored partner token.`);
149
+ return 0;
150
+ }
151
+ default:
152
+ throw new errors_1.CliError(sub
153
+ ? `Unknown subcommand 'partner-platforms ${sub}'. Try: list, get, set, registration, token, deliveries, remove.`
154
+ : 'partner-platforms needs a subcommand: list, get, set, registration, token, deliveries, remove.');
155
+ }
156
+ }
157
+ //# sourceMappingURL=partner-platforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-platforms.js","sourceRoot":"","sources":["../../src/commands/partner-platforms.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,19 @@ export declare function instanceCredential(ctx: RunContext, args: ParsedArgs): {
20
20
  };
21
21
  /** `atlas preflight` — run the instance's setup checks; exit 1 on errors (or warnings with --fail-on warning). */
22
22
  export declare function preflight(ctx: RunContext, args: ParsedArgs): Promise<number>;
23
+ /** `atlas doctor` — the integration-health report; exit 1 when a check fails. */
24
+ export declare function doctor(ctx: RunContext, args: ParsedArgs): Promise<number>;
23
25
  /** Public values, then each secret as a reference to its file — never the value. */
24
26
  export declare function envCommand(ctx: RunContext, args: ParsedArgs): Promise<number>;
27
+ /**
28
+ * Kubernetes output: a ConfigMap with the public values, `kubectl create secret`
29
+ * commands that read each secret straight from its 0600 file (so a value never
30
+ * passes through this output), and the container `envFrom` / `secretKeyRef`
31
+ * snippet that wires both in.
32
+ */
33
+ export declare function k8sManifest(product: string, environment: string, pub: Record<string, string>, secrets: Array<{
34
+ key: string;
35
+ file: string;
36
+ }>): string;
25
37
  /** `atlas client rotate <id> [--now | --overlap <seconds>]` — the new secret goes straight to its file. */
26
38
  export declare function client(ctx: RunContext, args: ParsedArgs): Promise<number>;