@padua/cli 1.2.0 → 1.3.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.
@@ -39,8 +39,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.initializeConfig = initializeConfig;
40
40
  exports.formatConfigJson = formatConfigJson;
41
41
  exports.displayNextSteps = displayNextSteps;
42
+ exports.getPaduaConfigDir = getPaduaConfigDir;
43
+ exports.getPaduaConfigPath = getPaduaConfigPath;
44
+ exports.initializeGlobalConfig = initializeGlobalConfig;
45
+ exports.displayGlobalNextSteps = displayGlobalNextSteps;
42
46
  const fs = __importStar(require("fs"));
43
47
  const path = __importStar(require("path"));
48
+ const os = __importStar(require("os"));
44
49
  const chalk_1 = __importDefault(require("chalk"));
45
50
  /**
46
51
  * Initialize config by writing to padua.config.json
@@ -120,4 +125,77 @@ function displayNextSteps(config, noColor = false) {
120
125
  }
121
126
  console.log('');
122
127
  }
128
+ /**
129
+ * Get the padua config directory path (cross-platform)
130
+ * ~/.padua on Unix, %USERPROFILE%\.padua on Windows
131
+ */
132
+ function getPaduaConfigDir() {
133
+ return path.join(os.homedir(), '.padua');
134
+ }
135
+ /**
136
+ * Get the padua config file path
137
+ */
138
+ function getPaduaConfigPath() {
139
+ return path.join(getPaduaConfigDir(), 'padua.config.json');
140
+ }
141
+ /**
142
+ * Initialize config by writing to ~/.padua/padua.config.json (global config)
143
+ *
144
+ * @param config - Configuration object to write
145
+ * @returns Path to the config file
146
+ * @throws Error if file write fails
147
+ */
148
+ async function initializeGlobalConfig(config) {
149
+ const configDir = getPaduaConfigDir();
150
+ const configPath = getPaduaConfigPath();
151
+ // Ensure ~/.padua directory exists
152
+ if (!fs.existsSync(configDir)) {
153
+ fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
154
+ }
155
+ try {
156
+ const formatted = formatConfigJson(config);
157
+ fs.writeFileSync(configPath, formatted, 'utf-8');
158
+ fs.chmodSync(configPath, 0o644);
159
+ return configPath;
160
+ }
161
+ catch (error) {
162
+ const err = error;
163
+ if (err.code === 'EACCES') {
164
+ throw new Error('Permission denied. Check directory write permissions.');
165
+ }
166
+ else if (err.code === 'ENOSPC') {
167
+ throw new Error('No disk space available.');
168
+ }
169
+ else if (err.code === 'EROFS') {
170
+ throw new Error('File system is read-only.');
171
+ }
172
+ else {
173
+ throw new Error(`Failed to write config file: ${err.message}`);
174
+ }
175
+ }
176
+ }
177
+ /**
178
+ * Display next steps for global config
179
+ *
180
+ * @param configPath - Path where config was saved
181
+ * @param noColor - Whether to disable colored output
182
+ */
183
+ function displayGlobalNextSteps(configPath, noColor = false) {
184
+ console.log('');
185
+ if (!noColor) {
186
+ console.log(chalk_1.default.cyan.bold('Next steps:'));
187
+ console.log(chalk_1.default.gray(` 1. Review configuration: cat ${configPath}`));
188
+ console.log(chalk_1.default.gray(' 2. Authenticate: padua login'));
189
+ console.log(chalk_1.default.gray(' 3. Check status: padua status'));
190
+ console.log(chalk_1.default.gray(' 4. View help: padua --help'));
191
+ }
192
+ else {
193
+ console.log('Next steps:');
194
+ console.log(` 1. Review configuration: cat ${configPath}`);
195
+ console.log(' 2. Authenticate: padua login');
196
+ console.log(' 3. Check status: padua status');
197
+ console.log(' 4. View help: padua --help');
198
+ }
199
+ console.log('');
200
+ }
123
201
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,4CA0BC;AAQD,4CAkBC;AAQD,4CAgBC;AAMD,8CAEC;AAKD,gDAEC;AASD,wDA0BC;AAQD,wDAkBC;AArKD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,kDAA0B;AAG1B;;;;;;GAMG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAmB,EAAE,UAAmB;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE3C,gBAAgB;QAChB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAEjD,kCAAkC;QAClC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+DAA+D;QAC/D,MAAM,GAAG,GAAG,KAA8B,CAAC;QAE3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,MAAmB;IAClD,4DAA4D;IAC5D,MAAM,OAAO,GAAgB;QAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,gDAAgD;IAChD,IAAI,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;QACvG,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC7C,CAAC;IAED,uCAAuC;IACvC,IAAI,MAAM,CAAC,GAAG,EAAE,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,MAAmB,EAAE,UAAmB,KAAK;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,sBAAsB,CAAC,MAAmB;IAC9D,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,mCAAmC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,UAAkB,EAAE,UAAmB,KAAK;IACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * SSO Session configuration for ~/.aws/config
3
+ */
4
+ export interface SSOSessionConfig {
5
+ sessionName: string;
6
+ startUrl: string;
7
+ region: string;
8
+ registrationScopes: string;
9
+ }
10
+ /**
11
+ * AWS Account information from SSO
12
+ */
13
+ export interface SSOAccount {
14
+ accountId: string;
15
+ accountName: string;
16
+ emailAddress?: string;
17
+ }
18
+ /**
19
+ * AWS Role information from SSO
20
+ */
21
+ export interface SSORole {
22
+ roleName: string;
23
+ accountId: string;
24
+ }
25
+ /**
26
+ * Combined account with roles
27
+ */
28
+ export interface AccountWithRoles {
29
+ account: SSOAccount;
30
+ roles: SSORole[];
31
+ }
32
+ /**
33
+ * Profile to be created
34
+ */
35
+ export interface ProfileConfig {
36
+ name: string;
37
+ accountId: string;
38
+ roleName: string;
39
+ }
40
+ /**
41
+ * Padua SSO defaults
42
+ */
43
+ export declare const PADUA_SSO_DEFAULTS: {
44
+ sessionName: string;
45
+ startUrl: string;
46
+ region: string;
47
+ registrationScopes: string;
48
+ };
49
+ /**
50
+ * Padua CodeArtifact defaults (hardcoded)
51
+ */
52
+ export declare const PADUA_CODEARTIFACT_DEFAULTS: {
53
+ domain: string;
54
+ domainOwner: string;
55
+ repository: string;
56
+ };
57
+ /**
58
+ * Padua ECR defaults (hardcoded)
59
+ */
60
+ export declare const PADUA_ECR_DEFAULTS: {
61
+ accountId: string;
62
+ region: string;
63
+ };
64
+ /**
65
+ * Get cached SSO access token if valid
66
+ */
67
+ export declare function getCachedAccessToken(startUrl: string): string | null;
68
+ /**
69
+ * Register OIDC client with SSO
70
+ */
71
+ export declare function registerSSOClient(startUrl: string, region: string): Promise<{
72
+ clientId: string;
73
+ clientSecret: string;
74
+ }>;
75
+ /**
76
+ * Start device authorization flow
77
+ */
78
+ export declare function startDeviceAuthorization(clientId: string, clientSecret: string, startUrl: string, region: string): Promise<{
79
+ deviceCode: string;
80
+ userCode: string;
81
+ verificationUri: string;
82
+ expiresIn: number;
83
+ }>;
84
+ /**
85
+ * Poll for access token after user authorization
86
+ */
87
+ export declare function pollForToken(clientId: string, clientSecret: string, deviceCode: string, region: string, expiresIn: number): Promise<string>;
88
+ /**
89
+ * Authenticate with SSO and get access token
90
+ * Uses cached token if valid, otherwise initiates device authorization flow
91
+ */
92
+ export declare function authenticateSSO(startUrl?: string, region?: string, onBrowserOpen?: (url: string, userCode: string) => void): Promise<string>;
93
+ /**
94
+ * List all AWS accounts the user has access to via SSO
95
+ */
96
+ export declare function listSSOAccounts(accessToken: string, region?: string): Promise<SSOAccount[]>;
97
+ /**
98
+ * List all roles for a specific account
99
+ */
100
+ export declare function listAccountRoles(accessToken: string, accountId: string, region?: string): Promise<SSORole[]>;
101
+ /**
102
+ * Discover all accounts and roles the user has access to
103
+ */
104
+ export declare function discoverAccountsAndRoles(accessToken: string, region?: string): Promise<AccountWithRoles[]>;
105
+ /**
106
+ * Generate profile name from account name
107
+ * Converts to lowercase, replaces spaces/special chars with hyphens
108
+ */
109
+ export declare function generateProfileName(accountName: string): string;
110
+ /**
111
+ * Build profile configurations from discovered accounts and roles
112
+ */
113
+ export declare function buildProfileConfigs(accountsWithRoles: AccountWithRoles[], selectedRole?: string): ProfileConfig[];
114
+ //# sourceMappingURL=sso-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-discovery.d.ts","sourceRoot":"","sources":["../../../src/commands/init/sso-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PADUA_ECR_DEFAULTS = exports.PADUA_CODEARTIFACT_DEFAULTS = exports.PADUA_SSO_DEFAULTS = void 0;
37
+ exports.getCachedAccessToken = getCachedAccessToken;
38
+ exports.registerSSOClient = registerSSOClient;
39
+ exports.startDeviceAuthorization = startDeviceAuthorization;
40
+ exports.pollForToken = pollForToken;
41
+ exports.authenticateSSO = authenticateSSO;
42
+ exports.listSSOAccounts = listSSOAccounts;
43
+ exports.listAccountRoles = listAccountRoles;
44
+ exports.discoverAccountsAndRoles = discoverAccountsAndRoles;
45
+ exports.generateProfileName = generateProfileName;
46
+ exports.buildProfileConfigs = buildProfileConfigs;
47
+ const child_process_1 = require("child_process");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const os = __importStar(require("os"));
51
+ /**
52
+ * Padua SSO defaults
53
+ */
54
+ exports.PADUA_SSO_DEFAULTS = {
55
+ sessionName: 'padua',
56
+ startUrl: 'https://paduasolutions.awsapps.com/start',
57
+ region: 'ap-southeast-2',
58
+ registrationScopes: 'sso:account:access',
59
+ };
60
+ /**
61
+ * Padua CodeArtifact defaults (hardcoded)
62
+ */
63
+ exports.PADUA_CODEARTIFACT_DEFAULTS = {
64
+ domain: 'paduafg',
65
+ domainOwner: '361485743373',
66
+ repository: 'paduafg',
67
+ };
68
+ /**
69
+ * Padua ECR defaults (hardcoded)
70
+ */
71
+ exports.PADUA_ECR_DEFAULTS = {
72
+ accountId: '361485743373',
73
+ region: 'ap-southeast-2',
74
+ };
75
+ const SSO_CACHE_DIR = path.join(os.homedir(), '.aws', 'sso', 'cache');
76
+ /**
77
+ * Get cached SSO access token if valid
78
+ */
79
+ function getCachedAccessToken(startUrl) {
80
+ try {
81
+ if (!fs.existsSync(SSO_CACHE_DIR)) {
82
+ return null;
83
+ }
84
+ const cacheFiles = fs.readdirSync(SSO_CACHE_DIR).filter(f => f.endsWith('.json'));
85
+ for (const file of cacheFiles) {
86
+ try {
87
+ const filePath = path.join(SSO_CACHE_DIR, file);
88
+ const content = fs.readFileSync(filePath, 'utf-8');
89
+ const cached = JSON.parse(content);
90
+ // Check if this cache is for our SSO start URL
91
+ if (cached.startUrl === startUrl && cached.accessToken) {
92
+ // Check if token is expired
93
+ const expiresAt = new Date(cached.expiresAt);
94
+ if (expiresAt > new Date()) {
95
+ return cached.accessToken;
96
+ }
97
+ }
98
+ }
99
+ catch {
100
+ // Skip invalid cache files
101
+ continue;
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Register OIDC client with SSO
112
+ */
113
+ async function registerSSOClient(startUrl, region) {
114
+ const result = (0, child_process_1.spawnSync)('aws', [
115
+ 'sso-oidc', 'register-client',
116
+ '--client-name', 'padua-cli',
117
+ '--client-type', 'public',
118
+ '--scopes', 'sso:account:access',
119
+ '--region', region,
120
+ '--output', 'json',
121
+ ], {
122
+ shell: false,
123
+ timeout: 30000,
124
+ maxBuffer: 1024 * 1024,
125
+ stdio: ['pipe', 'pipe', 'pipe'],
126
+ });
127
+ if (result.error || result.status !== 0) {
128
+ const stderr = result.stderr?.toString() || '';
129
+ if (stderr.includes('ENOENT')) {
130
+ throw new Error('AWS CLI not found. Please install AWS CLI v2: https://aws.amazon.com/cli/');
131
+ }
132
+ throw new Error(`Failed to register SSO client: ${stderr}`);
133
+ }
134
+ const output = JSON.parse(result.stdout.toString());
135
+ return {
136
+ clientId: output.clientId,
137
+ clientSecret: output.clientSecret,
138
+ };
139
+ }
140
+ /**
141
+ * Start device authorization flow
142
+ */
143
+ async function startDeviceAuthorization(clientId, clientSecret, startUrl, region) {
144
+ const result = (0, child_process_1.spawnSync)('aws', [
145
+ 'sso-oidc', 'start-device-authorization',
146
+ '--client-id', clientId,
147
+ '--client-secret', clientSecret,
148
+ '--start-url', startUrl,
149
+ '--region', region,
150
+ '--output', 'json',
151
+ ], {
152
+ shell: false,
153
+ timeout: 30000,
154
+ maxBuffer: 1024 * 1024,
155
+ stdio: ['pipe', 'pipe', 'pipe'],
156
+ });
157
+ if (result.error || result.status !== 0) {
158
+ const stderr = result.stderr?.toString() || '';
159
+ throw new Error(`Failed to start device authorization: ${stderr}`);
160
+ }
161
+ const output = JSON.parse(result.stdout.toString());
162
+ return {
163
+ deviceCode: output.deviceCode,
164
+ userCode: output.userCode,
165
+ verificationUri: output.verificationUriComplete || output.verificationUri,
166
+ expiresIn: output.expiresIn,
167
+ };
168
+ }
169
+ /**
170
+ * Sleep helper
171
+ */
172
+ function sleep(ms) {
173
+ return new Promise(resolve => setTimeout(resolve, ms));
174
+ }
175
+ /**
176
+ * Poll for access token after user authorization
177
+ */
178
+ async function pollForToken(clientId, clientSecret, deviceCode, region, expiresIn) {
179
+ const pollInterval = 5000; // 5 seconds
180
+ const maxAttempts = Math.floor((expiresIn * 1000) / pollInterval);
181
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
182
+ const result = (0, child_process_1.spawnSync)('aws', [
183
+ 'sso-oidc', 'create-token',
184
+ '--client-id', clientId,
185
+ '--client-secret', clientSecret,
186
+ '--grant-type', 'urn:ietf:params:oauth:grant-type:device_code',
187
+ '--device-code', deviceCode,
188
+ '--region', region,
189
+ '--output', 'json',
190
+ ], {
191
+ shell: false,
192
+ timeout: 30000,
193
+ maxBuffer: 1024 * 1024,
194
+ stdio: ['pipe', 'pipe', 'pipe'],
195
+ });
196
+ if (result.status === 0) {
197
+ const output = JSON.parse(result.stdout.toString());
198
+ return output.accessToken;
199
+ }
200
+ const stderr = result.stderr?.toString() || '';
201
+ if (stderr.includes('AuthorizationPendingException') || stderr.includes('authorization_pending')) {
202
+ // User hasn't authorized yet, wait and retry
203
+ await sleep(pollInterval);
204
+ continue;
205
+ }
206
+ if (stderr.includes('SlowDownException') || stderr.includes('slow_down')) {
207
+ // Rate limited, wait longer
208
+ await sleep(pollInterval * 2);
209
+ continue;
210
+ }
211
+ if (stderr.includes('ExpiredTokenException') || stderr.includes('expired_token')) {
212
+ throw new Error('Authorization expired. Please try again.');
213
+ }
214
+ throw new Error(`Failed to get access token: ${stderr}`);
215
+ }
216
+ throw new Error('Authorization timed out. Please try again.');
217
+ }
218
+ /**
219
+ * Authenticate with SSO and get access token
220
+ * Uses cached token if valid, otherwise initiates device authorization flow
221
+ */
222
+ async function authenticateSSO(startUrl = exports.PADUA_SSO_DEFAULTS.startUrl, region = exports.PADUA_SSO_DEFAULTS.region, onBrowserOpen) {
223
+ // Check for cached valid token first
224
+ const cachedToken = getCachedAccessToken(startUrl);
225
+ if (cachedToken) {
226
+ return cachedToken;
227
+ }
228
+ // No valid cached token, start device authorization flow
229
+ const client = await registerSSOClient(startUrl, region);
230
+ const auth = await startDeviceAuthorization(client.clientId, client.clientSecret, startUrl, region);
231
+ // Notify caller to open browser
232
+ if (onBrowserOpen) {
233
+ onBrowserOpen(auth.verificationUri, auth.userCode);
234
+ }
235
+ // Poll for token
236
+ return pollForToken(client.clientId, client.clientSecret, auth.deviceCode, region, auth.expiresIn);
237
+ }
238
+ /**
239
+ * List all AWS accounts the user has access to via SSO
240
+ */
241
+ async function listSSOAccounts(accessToken, region = exports.PADUA_SSO_DEFAULTS.region) {
242
+ const accounts = [];
243
+ let nextToken;
244
+ do {
245
+ const args = [
246
+ 'sso', 'list-accounts',
247
+ '--access-token', accessToken,
248
+ '--region', region,
249
+ '--output', 'json',
250
+ ];
251
+ if (nextToken) {
252
+ args.push('--starting-token', nextToken);
253
+ }
254
+ const result = (0, child_process_1.spawnSync)('aws', args, {
255
+ shell: false,
256
+ timeout: 30000,
257
+ maxBuffer: 1024 * 1024,
258
+ stdio: ['pipe', 'pipe', 'pipe'],
259
+ });
260
+ if (result.error || result.status !== 0) {
261
+ const stderr = result.stderr?.toString() || '';
262
+ if (stderr.includes('UnauthorizedException') || stderr.includes('Token is invalid')) {
263
+ throw new Error('SSO session expired. Please authenticate again.');
264
+ }
265
+ throw new Error(`Failed to list SSO accounts: ${stderr}`);
266
+ }
267
+ const output = JSON.parse(result.stdout.toString());
268
+ for (const account of output.accountList || []) {
269
+ accounts.push({
270
+ accountId: account.accountId,
271
+ accountName: account.accountName,
272
+ emailAddress: account.emailAddress,
273
+ });
274
+ }
275
+ nextToken = output.nextToken;
276
+ } while (nextToken);
277
+ return accounts;
278
+ }
279
+ /**
280
+ * List all roles for a specific account
281
+ */
282
+ async function listAccountRoles(accessToken, accountId, region = exports.PADUA_SSO_DEFAULTS.region) {
283
+ const roles = [];
284
+ let nextToken;
285
+ do {
286
+ const args = [
287
+ 'sso', 'list-account-roles',
288
+ '--access-token', accessToken,
289
+ '--account-id', accountId,
290
+ '--region', region,
291
+ '--output', 'json',
292
+ ];
293
+ if (nextToken) {
294
+ args.push('--starting-token', nextToken);
295
+ }
296
+ const result = (0, child_process_1.spawnSync)('aws', args, {
297
+ shell: false,
298
+ timeout: 30000,
299
+ maxBuffer: 1024 * 1024,
300
+ stdio: ['pipe', 'pipe', 'pipe'],
301
+ });
302
+ if (result.error || result.status !== 0) {
303
+ const stderr = result.stderr?.toString() || '';
304
+ throw new Error(`Failed to list account roles: ${stderr}`);
305
+ }
306
+ const output = JSON.parse(result.stdout.toString());
307
+ for (const role of output.roleList || []) {
308
+ roles.push({
309
+ roleName: role.roleName,
310
+ accountId: accountId,
311
+ });
312
+ }
313
+ nextToken = output.nextToken;
314
+ } while (nextToken);
315
+ return roles;
316
+ }
317
+ /**
318
+ * Discover all accounts and roles the user has access to
319
+ */
320
+ async function discoverAccountsAndRoles(accessToken, region = exports.PADUA_SSO_DEFAULTS.region) {
321
+ const accounts = await listSSOAccounts(accessToken, region);
322
+ const result = [];
323
+ for (const account of accounts) {
324
+ const roles = await listAccountRoles(accessToken, account.accountId, region);
325
+ result.push({ account, roles });
326
+ }
327
+ // Sort by account name for consistent output
328
+ result.sort((a, b) => a.account.accountName.localeCompare(b.account.accountName));
329
+ return result;
330
+ }
331
+ /**
332
+ * Generate profile name from account name
333
+ * Converts to lowercase, replaces spaces/special chars with hyphens
334
+ */
335
+ function generateProfileName(accountName) {
336
+ return accountName
337
+ .toLowerCase()
338
+ .replace(/[^a-z0-9]+/g, '-')
339
+ .replace(/^-|-$/g, '')
340
+ .substring(0, 128);
341
+ }
342
+ /**
343
+ * Build profile configurations from discovered accounts and roles
344
+ */
345
+ function buildProfileConfigs(accountsWithRoles, selectedRole) {
346
+ const profiles = [];
347
+ for (const { account, roles } of accountsWithRoles) {
348
+ // If a specific role is selected, use only that role
349
+ // Otherwise, use the first available role (usually the highest permission)
350
+ const roleToUse = selectedRole
351
+ ? roles.find(r => r.roleName === selectedRole)
352
+ : roles[0];
353
+ if (roleToUse) {
354
+ profiles.push({
355
+ name: generateProfileName(account.accountName),
356
+ accountId: account.accountId,
357
+ roleName: roleToUse.roleName,
358
+ });
359
+ }
360
+ }
361
+ return profiles;
362
+ }
363
+ //# sourceMappingURL=sso-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-discovery.js","sourceRoot":"","sources":["../../../src/commands/init/sso-discovery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFA,oDAgCC;AAKD,8CAmCC;AAKD,4DAoCC;AAYD,oCAwDC;AAMD,0CAiCC;AAKD,0CAgDC;AAKD,4CA8CC;AAKD,4DAgBC;AAMD,kDAMC;AAKD,kDAuBC;AAldD,iDAA0C;AAC1C,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AA8CzB;;GAEG;AACU,QAAA,kBAAkB,GAAG;IAChC,WAAW,EAAE,OAAO;IACpB,QAAQ,EAAE,0CAA0C;IACpD,MAAM,EAAE,gBAAgB;IACxB,kBAAkB,EAAE,oBAAoB;CACzC,CAAC;AAEF;;GAEG;AACU,QAAA,2BAA2B,GAAG;IACzC,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,cAAc;IAC3B,UAAU,EAAE,SAAS;CACtB,CAAC;AAEF;;GAEG;AACU,QAAA,kBAAkB,GAAG;IAChC,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAEtE;;GAEG;AACH,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAElF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBAChD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnC,+CAA+C;gBAC/C,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvD,4BAA4B;oBAC5B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC7C,IAAI,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;wBAC3B,OAAO,MAAM,CAAC,WAAW,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;gBAC3B,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,MAAc;IAEd,MAAM,MAAM,GAAG,IAAA,yBAAS,EACtB,KAAK,EACL;QACE,UAAU,EAAE,iBAAiB;QAC7B,eAAe,EAAE,WAAW;QAC5B,eAAe,EAAE,QAAQ;QACzB,UAAU,EAAE,oBAAoB;QAChC,UAAU,EAAE,MAAM;QAClB,UAAU,EAAE,MAAM;KACnB,EACD;QACE,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI,GAAG,IAAI;QACtB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CACF,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,wBAAwB,CAC5C,QAAgB,EAChB,YAAoB,EACpB,QAAgB,EAChB,MAAc;IAEd,MAAM,MAAM,GAAG,IAAA,yBAAS,EACtB,KAAK,EACL;QACE,UAAU,EAAE,4BAA4B;QACxC,aAAa,EAAE,QAAQ;QACvB,iBAAiB,EAAE,YAAY;QAC/B,aAAa,EAAE,QAAQ;QACvB,UAAU,EAAE,MAAM;QAClB,UAAU,EAAE,MAAM;KACnB,EACD;QACE,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI,GAAG,IAAI;QACtB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CACF,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,eAAe,EAAE,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,eAAe;QACzE,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,YAAoB,EACpB,UAAkB,EAClB,MAAc,EACd,SAAiB;IAEjB,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,YAAY;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAElE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAA,yBAAS,EACtB,KAAK,EACL;YACE,UAAU,EAAE,cAAc;YAC1B,aAAa,EAAE,QAAQ;YACvB,iBAAiB,EAAE,YAAY;YAC/B,cAAc,EAAE,8CAA8C;YAC9D,eAAe,EAAE,UAAU;YAC3B,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,MAAM;SACnB,EACD;YACE,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,GAAG,IAAI;YACtB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CACF,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACjG,6CAA6C;YAC7C,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACzE,4BAA4B;YAC5B,MAAM,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,eAAe,CACnC,WAAmB,0BAAkB,CAAC,QAAQ,EAC9C,SAAiB,0BAAkB,CAAC,MAAM,EAC1C,aAAuD;IAEvD,qCAAqC;IACrC,MAAM,WAAW,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,yDAAyD;IACzD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,wBAAwB,CACzC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,YAAY,EACnB,QAAQ,EACR,MAAM,CACP,CAAC;IAEF,gCAAgC;IAChC,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,iBAAiB;IACjB,OAAO,YAAY,CACjB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,YAAY,EACnB,IAAI,CAAC,UAAU,EACf,MAAM,EACN,IAAI,CAAC,SAAS,CACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,SAAiB,0BAAkB,CAAC,MAAM;IAE1C,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,IAAI,SAA6B,CAAC;IAElC,GAAG,CAAC;QACF,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,eAAe;YACtB,gBAAgB,EAAE,WAAW;YAC7B,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,MAAM;SACnB,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,IAAI,EAAE;YACpC,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,GAAG,IAAI;YACtB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACpF,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEpD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC,CAAC;QACL,CAAC;QAED,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC,QAAQ,SAAS,EAAE;IAEpB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,SAAiB,EACjB,SAAiB,0BAAkB,CAAC,MAAM;IAE1C,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,SAA6B,CAAC;IAElC,GAAG,CAAC;QACF,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,oBAAoB;YAC3B,gBAAgB,EAAE,WAAW;YAC7B,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,MAAM;SACnB,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,IAAI,EAAE;YACpC,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,GAAG,IAAI;YACtB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC;gBACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,SAAS;aACrB,CAAC,CAAC;QACL,CAAC;QAED,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC,QAAQ,SAAS,EAAE;IAEpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,wBAAwB,CAC5C,WAAmB,EACnB,SAAiB,0BAAkB,CAAC,MAAM;IAE1C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,6CAA6C;IAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAElF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,WAAmB;IACrD,OAAO,WAAW;SACf,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,iBAAqC,EACrC,YAAqB;IAErB,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACnD,qDAAqD;QACrD,2EAA2E;QAC3E,MAAM,SAAS,GAAG,YAAY;YAC5B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC;YAC9C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEb,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/status/checks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAe,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK/D;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiFxE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuDrG;AA4BD;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAqE1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmBrD"}
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/status/checks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAe,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK/D;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiFxE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuDrG;AA4BD;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAwF1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmBrD"}
@@ -211,12 +211,11 @@ async function checkECRStatus(config) {
211
211
  try {
212
212
  const content = fs.readFileSync(dockerConfigPath, 'utf-8');
213
213
  const dockerConfig = JSON.parse(content);
214
- // Check if using credential helper (common on macOS)
214
+ // Check if using credential helper for specific registries
215
215
  if (dockerConfig.credHelpers) {
216
216
  const helperKey = Object.keys(dockerConfig.credHelpers).find(k => k.includes('ecr') && k.includes(config.region));
217
217
  if (helperKey) {
218
218
  // Credential helper is configured - assume authenticated
219
- // (we can't easily check helper-stored credentials)
220
219
  return {
221
220
  authenticated: true,
222
221
  registry,
@@ -233,15 +232,32 @@ async function checkECRStatus(config) {
233
232
  }
234
233
  // Look for ECR registry entry
235
234
  const ecrEntry = Object.keys(dockerConfig.auths).find(k => k.includes(config.accountId) && k.includes('ecr') && k.includes(config.region));
236
- if (!ecrEntry || !dockerConfig.auths[ecrEntry]?.auth) {
235
+ if (!ecrEntry) {
237
236
  return {
238
237
  authenticated: false,
239
238
  registry,
240
239
  error: 'No ECR credentials found',
241
240
  };
242
241
  }
243
- // ECR auth exists - tokens are valid for 12 hours but we can't check expiry
244
- // from the stored credential alone
242
+ // Check if using global credsStore (e.g., Docker Desktop)
243
+ // When credsStore is set, auths entries may be empty {} but credentials
244
+ // are stored in the system credential store
245
+ if (dockerConfig.credsStore && !dockerConfig.auths[ecrEntry]?.auth) {
246
+ // Registry entry exists + credsStore configured = credentials in external store
247
+ return {
248
+ authenticated: true,
249
+ registry,
250
+ };
251
+ }
252
+ // Check for inline auth token
253
+ if (!dockerConfig.auths[ecrEntry]?.auth) {
254
+ return {
255
+ authenticated: false,
256
+ registry,
257
+ error: 'No ECR credentials found',
258
+ };
259
+ }
260
+ // ECR auth exists inline
245
261
  return {
246
262
  authenticated: true,
247
263
  registry,