@quiltdata/benchling-webhook 0.7.7 → 0.7.8-20251115T063729Z

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 (81) hide show
  1. package/README.md +24 -11
  2. package/dist/bin/cli.js +77 -3
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/bin/commands/config-show.d.ts +14 -0
  5. package/dist/bin/commands/config-show.d.ts.map +1 -0
  6. package/dist/bin/commands/config-show.js +24 -0
  7. package/dist/bin/commands/config-show.js.map +1 -0
  8. package/dist/bin/commands/deploy.d.ts +14 -0
  9. package/dist/bin/commands/deploy.d.ts.map +1 -1
  10. package/dist/bin/commands/deploy.js +1 -0
  11. package/dist/bin/commands/deploy.js.map +1 -1
  12. package/dist/bin/commands/infer-quilt-config.d.ts +3 -0
  13. package/dist/bin/commands/infer-quilt-config.d.ts.map +1 -1
  14. package/dist/bin/commands/infer-quilt-config.js +74 -8
  15. package/dist/bin/commands/infer-quilt-config.js.map +1 -1
  16. package/dist/bin/commands/install.d.ts.map +1 -1
  17. package/dist/bin/commands/install.js +40 -7
  18. package/dist/bin/commands/install.js.map +1 -1
  19. package/dist/bin/commands/manifest.d.ts +20 -3
  20. package/dist/bin/commands/manifest.d.ts.map +1 -1
  21. package/dist/bin/commands/manifest.js +23 -7
  22. package/dist/bin/commands/manifest.js.map +1 -1
  23. package/dist/bin/commands/setup-wizard.d.ts +67 -13
  24. package/dist/bin/commands/setup-wizard.d.ts.map +1 -1
  25. package/dist/bin/commands/setup-wizard.js +239 -742
  26. package/dist/bin/commands/setup-wizard.js.map +1 -1
  27. package/dist/bin/commands/sync-secrets.d.ts +7 -7
  28. package/dist/bin/commands/sync-secrets.d.ts.map +1 -1
  29. package/dist/bin/commands/sync-secrets.js +55 -15
  30. package/dist/bin/commands/sync-secrets.js.map +1 -1
  31. package/dist/bin/commands/validate.d.ts +18 -3
  32. package/dist/bin/commands/validate.d.ts.map +1 -1
  33. package/dist/bin/commands/validate.js +103 -69
  34. package/dist/bin/commands/validate.js.map +1 -1
  35. package/dist/lib/types/config.d.ts +13 -0
  36. package/dist/lib/types/config.d.ts.map +1 -1
  37. package/dist/lib/types/config.js +1 -0
  38. package/dist/lib/types/config.js.map +1 -1
  39. package/dist/lib/utils/config.d.ts +14 -17
  40. package/dist/lib/utils/config.d.ts.map +1 -1
  41. package/dist/lib/utils/config.js +6 -88
  42. package/dist/lib/utils/config.js.map +1 -1
  43. package/dist/lib/wizard/phase1-catalog-discovery.d.ts +41 -0
  44. package/dist/lib/wizard/phase1-catalog-discovery.d.ts.map +1 -0
  45. package/dist/lib/wizard/phase1-catalog-discovery.js +206 -0
  46. package/dist/lib/wizard/phase1-catalog-discovery.js.map +1 -0
  47. package/dist/lib/wizard/phase2-stack-query.d.ts +35 -0
  48. package/dist/lib/wizard/phase2-stack-query.d.ts.map +1 -0
  49. package/dist/lib/wizard/phase2-stack-query.js +99 -0
  50. package/dist/lib/wizard/phase2-stack-query.js.map +1 -0
  51. package/dist/lib/wizard/phase3-parameter-collection.d.ts +24 -0
  52. package/dist/lib/wizard/phase3-parameter-collection.d.ts.map +1 -0
  53. package/dist/lib/wizard/phase3-parameter-collection.js +399 -0
  54. package/dist/lib/wizard/phase3-parameter-collection.js.map +1 -0
  55. package/dist/lib/wizard/phase4-validation.d.ts +22 -0
  56. package/dist/lib/wizard/phase4-validation.d.ts.map +1 -0
  57. package/dist/lib/wizard/phase4-validation.js +294 -0
  58. package/dist/lib/wizard/phase4-validation.js.map +1 -0
  59. package/dist/lib/wizard/phase5-mode-decision.d.ts +22 -0
  60. package/dist/lib/wizard/phase5-mode-decision.d.ts.map +1 -0
  61. package/dist/lib/wizard/phase5-mode-decision.js +65 -0
  62. package/dist/lib/wizard/phase5-mode-decision.js.map +1 -0
  63. package/dist/lib/wizard/phase6-integrated-mode.d.ts +24 -0
  64. package/dist/lib/wizard/phase6-integrated-mode.d.ts.map +1 -0
  65. package/dist/lib/wizard/phase6-integrated-mode.js +131 -0
  66. package/dist/lib/wizard/phase6-integrated-mode.js.map +1 -0
  67. package/dist/lib/wizard/phase7-standalone-mode.d.ts +25 -0
  68. package/dist/lib/wizard/phase7-standalone-mode.d.ts.map +1 -0
  69. package/dist/lib/wizard/phase7-standalone-mode.js +210 -0
  70. package/dist/lib/wizard/phase7-standalone-mode.js.map +1 -0
  71. package/dist/lib/wizard/types.d.ts +175 -0
  72. package/dist/lib/wizard/types.d.ts.map +1 -0
  73. package/dist/lib/wizard/types.js +11 -0
  74. package/dist/lib/wizard/types.js.map +1 -0
  75. package/dist/package.json +3 -4
  76. package/package.json +3 -4
  77. package/dist/bin/commands/get-env.d.ts +0 -16
  78. package/dist/bin/commands/get-env.d.ts.map +0 -1
  79. package/dist/bin/commands/get-env.js +0 -210
  80. package/dist/bin/commands/get-env.js.map +0 -1
  81. package/env.template +0 -79
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 2: Stack Query
4
+ *
5
+ * Queries CloudFormation stack for the confirmed catalog and extracts
6
+ * all available parameters including BenchlingSecret ARN.
7
+ *
8
+ * @module wizard/phase2-stack-query
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.runStackQuery = runStackQuery;
15
+ const chalk_1 = __importDefault(require("chalk"));
16
+ const infer_quilt_config_1 = require("../../bin/commands/infer-quilt-config");
17
+ /**
18
+ * Phase 2: Stack Query
19
+ *
20
+ * Responsibilities:
21
+ * - Query CloudFormation stack for the confirmed catalog
22
+ * - Extract ALL available parameters from stack
23
+ * - Handle stack query failures gracefully
24
+ * - Return stack configuration
25
+ *
26
+ * @param catalogDns - Confirmed catalog DNS name
27
+ * @param options - Stack query options
28
+ * @returns Stack query result
29
+ */
30
+ async function runStackQuery(catalogDns, options = {}) {
31
+ const { awsProfile, awsRegion, yes = false } = options;
32
+ console.log(`Querying CloudFormation stack for catalog: ${catalogDns}...\n`);
33
+ try {
34
+ // Use inferQuiltConfig with the confirmed catalog - this will skip quilt3 check
35
+ const inferenceResult = await (0, infer_quilt_config_1.inferQuiltConfig)({
36
+ region: awsRegion,
37
+ profile: awsProfile,
38
+ interactive: false, // Don't prompt - we already have the catalog
39
+ yes: true, // Auto-confirm - we already got user's catalog choice
40
+ catalogDns: catalogDns, // Pass the confirmed catalog
41
+ });
42
+ // Verify the inferred catalog matches our confirmed catalog
43
+ const normalizedInferred = inferenceResult.catalog?.replace(/^https?:\/\//, "").replace(/\/$/, "");
44
+ const normalizedConfirmed = catalogDns.replace(/^https?:\/\//, "").replace(/\/$/, "");
45
+ if (normalizedInferred !== normalizedConfirmed) {
46
+ console.log(chalk_1.default.yellow(`Warning: Inferred catalog (${normalizedInferred}) does not match confirmed catalog (${normalizedConfirmed})`));
47
+ }
48
+ // Extract data from inference result
49
+ if (!inferenceResult.stackArn) {
50
+ throw new Error(`No CloudFormation stack found for catalog: ${catalogDns}`);
51
+ }
52
+ const stackArn = inferenceResult.stackArn;
53
+ const database = inferenceResult.database || "quilt_catalog";
54
+ const queueUrl = inferenceResult.queueUrl || "";
55
+ const region = inferenceResult.region || awsRegion || "us-east-1";
56
+ const account = inferenceResult.account || "";
57
+ const benchlingSecretArn = inferenceResult.benchlingSecretArn;
58
+ // Log what we found
59
+ console.log(chalk_1.default.green("✓ Stack query succeeded\n"));
60
+ console.log(chalk_1.default.dim(`Stack ARN: ${stackArn}`));
61
+ console.log(chalk_1.default.dim(`Database: ${database}`));
62
+ console.log(chalk_1.default.dim(`Queue URL: ${queueUrl}`));
63
+ console.log(chalk_1.default.dim(`Region: ${region}`));
64
+ console.log(chalk_1.default.dim(`Account: ${account}`));
65
+ if (benchlingSecretArn) {
66
+ console.log(chalk_1.default.dim(`BenchlingSecret: ${benchlingSecretArn}`));
67
+ }
68
+ else {
69
+ console.log(chalk_1.default.dim("BenchlingSecret: Not found in stack"));
70
+ }
71
+ console.log("");
72
+ return {
73
+ stackArn,
74
+ catalog: normalizedConfirmed,
75
+ database,
76
+ queueUrl,
77
+ region,
78
+ account,
79
+ benchlingSecretArn,
80
+ stackQuerySucceeded: true,
81
+ };
82
+ }
83
+ catch (error) {
84
+ const errorMessage = error.message;
85
+ console.error(chalk_1.default.red(`Stack query failed: ${errorMessage}\n`));
86
+ // Return partial data for graceful degradation
87
+ return {
88
+ stackArn: "",
89
+ catalog: catalogDns,
90
+ database: "quilt_catalog",
91
+ queueUrl: "",
92
+ region: awsRegion || "us-east-1",
93
+ account: "",
94
+ benchlingSecretArn: undefined,
95
+ stackQuerySucceeded: false,
96
+ };
97
+ }
98
+ }
99
+ //# sourceMappingURL=phase2-stack-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase2-stack-query.js","sourceRoot":"","sources":["../../../lib/wizard/phase2-stack-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Phase 3: Parameter Collection
3
+ *
4
+ * Collects all required parameters from the user, using stack query results
5
+ * as defaults to avoid re-prompting.
6
+ *
7
+ * @module wizard/phase3-parameter-collection
8
+ */
9
+ import { ParameterCollectionInput, ParameterCollectionResult } from "./types";
10
+ /**
11
+ * Phase 3: Parameter Collection
12
+ *
13
+ * Responsibilities:
14
+ * - Collect Benchling credentials
15
+ * - Collect package settings
16
+ * - Collect deployment configuration
17
+ * - Use stack query results as defaults (don't re-prompt)
18
+ * - Return complete configuration
19
+ *
20
+ * @param input - Parameter collection input
21
+ * @returns Parameter collection result
22
+ */
23
+ export declare function runParameterCollection(input: ParameterCollectionInput): Promise<ParameterCollectionResult>;
24
+ //# sourceMappingURL=phase3-parameter-collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase3-parameter-collection.d.ts","sourceRoot":"","sources":["../../../lib/wizard/phase3-parameter-collection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CACxC,KAAK,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CAqYpC"}
@@ -0,0 +1,399 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 3: Parameter Collection
4
+ *
5
+ * Collects all required parameters from the user, using stack query results
6
+ * as defaults to avoid re-prompting.
7
+ *
8
+ * @module wizard/phase3-parameter-collection
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.runParameterCollection = runParameterCollection;
15
+ const inquirer_1 = __importDefault(require("inquirer"));
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const manifest_1 = require("../../bin/commands/manifest");
18
+ /**
19
+ * Phase 3: Parameter Collection
20
+ *
21
+ * Responsibilities:
22
+ * - Collect Benchling credentials
23
+ * - Collect package settings
24
+ * - Collect deployment configuration
25
+ * - Use stack query results as defaults (don't re-prompt)
26
+ * - Return complete configuration
27
+ *
28
+ * @param input - Parameter collection input
29
+ * @returns Parameter collection result
30
+ */
31
+ async function runParameterCollection(input) {
32
+ const { stackQuery, existingConfig, yes = false } = input;
33
+ // =========================================================================
34
+ // Benchling Configuration
35
+ // =========================================================================
36
+ console.log(chalk_1.default.cyan("Benchling Configuration:"));
37
+ // Tenant
38
+ let tenant;
39
+ if (input.benchlingTenant) {
40
+ tenant = input.benchlingTenant;
41
+ console.log(` Tenant: ${tenant} (from CLI)`);
42
+ }
43
+ else if (yes) {
44
+ // In non-interactive mode, use existing config or error
45
+ if (existingConfig?.benchling?.tenant) {
46
+ tenant = existingConfig.benchling.tenant;
47
+ console.log(` Tenant: ${tenant} (from existing config)`);
48
+ }
49
+ else {
50
+ throw new Error("--benchling-tenant is required in non-interactive mode");
51
+ }
52
+ }
53
+ else {
54
+ // Always show prompt with default from existing config
55
+ const tenantAnswer = await inquirer_1.default.prompt([
56
+ {
57
+ type: "input",
58
+ name: "tenant",
59
+ message: "Benchling Tenant:",
60
+ default: existingConfig?.benchling?.tenant || "",
61
+ validate: (value) => value.trim().length > 0 || "Tenant is required",
62
+ },
63
+ ]);
64
+ tenant = tenantAnswer.tenant;
65
+ }
66
+ // Check if we have existing app - offer to reuse or create new
67
+ let shouldReuseApp = true; // Default to reusing existing app
68
+ const catalogChanged = existingConfig?.quilt?.catalog && existingConfig.quilt.catalog !== stackQuery.catalog;
69
+ if (existingConfig?.benchling?.appDefinitionId && !yes) {
70
+ // Show catalog change warning if applicable
71
+ if (catalogChanged) {
72
+ console.log("\n" + chalk_1.default.yellow(`Catalog changed from ${existingConfig.quilt.catalog} to ${stackQuery.catalog}`));
73
+ }
74
+ // Always ask if user wants to reuse existing app or create new one
75
+ const { reuseApp } = await inquirer_1.default.prompt([
76
+ {
77
+ type: "list",
78
+ name: "reuseApp",
79
+ message: "Benchling app configuration:",
80
+ choices: [
81
+ {
82
+ name: `Use existing app (${existingConfig.benchling.appDefinitionId})`,
83
+ value: true,
84
+ },
85
+ {
86
+ name: "Create new app for this catalog",
87
+ value: false,
88
+ },
89
+ ],
90
+ default: true,
91
+ },
92
+ ]);
93
+ shouldReuseApp = reuseApp;
94
+ if (!shouldReuseApp) {
95
+ console.log(chalk_1.default.dim("Will prompt for new app credentials\n"));
96
+ }
97
+ }
98
+ // App Definition ID
99
+ let appDefinitionId;
100
+ let hasAppDefId = false;
101
+ if (input.benchlingAppDefinitionId) {
102
+ appDefinitionId = input.benchlingAppDefinitionId;
103
+ hasAppDefId = true;
104
+ console.log(` App Definition ID: ${appDefinitionId} (from CLI)`);
105
+ }
106
+ else if (yes) {
107
+ // In non-interactive mode, use existing config or error
108
+ if (existingConfig?.benchling?.appDefinitionId && shouldReuseApp) {
109
+ appDefinitionId = existingConfig.benchling.appDefinitionId;
110
+ hasAppDefId = true;
111
+ console.log(` App Definition ID: ${appDefinitionId} (from existing config)`);
112
+ }
113
+ else {
114
+ throw new Error("--benchling-app-definition-id is required in non-interactive mode");
115
+ }
116
+ }
117
+ else if (existingConfig?.benchling?.appDefinitionId && shouldReuseApp) {
118
+ // Have existing app ID and user chose to reuse - show prompt with default
119
+ const appDefAnswer = await inquirer_1.default.prompt([
120
+ {
121
+ type: "input",
122
+ name: "appDefinitionId",
123
+ message: "Benchling App Definition ID:",
124
+ default: existingConfig.benchling.appDefinitionId,
125
+ validate: (value) => value.trim().length > 0 || "App definition ID is required",
126
+ },
127
+ ]);
128
+ appDefinitionId = appDefAnswer.appDefinitionId;
129
+ hasAppDefId = true;
130
+ }
131
+ else if (!shouldReuseApp) {
132
+ // User explicitly chose to create new app - skip to manifest generation
133
+ hasAppDefId = false;
134
+ }
135
+ else {
136
+ // No existing app ID and no choice made - ask if they have one
137
+ const hasAppDefIdAnswer = await inquirer_1.default.prompt([
138
+ {
139
+ type: "confirm",
140
+ name: "hasIt",
141
+ message: "Do you have a Benchling App Definition ID for this app?",
142
+ default: false,
143
+ },
144
+ ]);
145
+ hasAppDefId = hasAppDefIdAnswer.hasIt;
146
+ if (hasAppDefId) {
147
+ // Prompt for it
148
+ const appDefAnswer = await inquirer_1.default.prompt([
149
+ {
150
+ type: "input",
151
+ name: "appDefinitionId",
152
+ message: "Benchling App Definition ID:",
153
+ validate: (value) => value.trim().length > 0 || "App definition ID is required",
154
+ },
155
+ ]);
156
+ appDefinitionId = appDefAnswer.appDefinitionId;
157
+ }
158
+ }
159
+ if (!hasAppDefId) {
160
+ // They don't have it - create manifest and guide them
161
+ console.log("\n" + chalk_1.default.blue("Creating app manifest...") + "\n");
162
+ await (0, manifest_1.manifestCommand)({
163
+ catalog: stackQuery.catalog,
164
+ output: "app-manifest.yaml",
165
+ });
166
+ console.log("\n" + chalk_1.default.yellow("After you have installed the app in Benchling and have the App Definition ID, you can continue.") + "\n");
167
+ // Now ask for the app definition ID
168
+ const appDefAnswer = await inquirer_1.default.prompt([
169
+ {
170
+ type: "input",
171
+ name: "appDefinitionId",
172
+ message: "Benchling App Definition ID:",
173
+ validate: (value) => value.trim().length > 0 || "App definition ID is required to continue",
174
+ },
175
+ ]);
176
+ appDefinitionId = appDefAnswer.appDefinitionId;
177
+ }
178
+ // Validation: Exit if no app definition ID
179
+ if (!appDefinitionId || appDefinitionId.trim().length === 0) {
180
+ console.log("\n" + chalk_1.default.red("Setup cannot continue without an App Definition ID."));
181
+ console.log(chalk_1.default.yellow("Please install the app in Benchling first, then run setup again.\n"));
182
+ process.exit(0);
183
+ }
184
+ // OAuth Credentials
185
+ let clientId;
186
+ let clientSecret;
187
+ if (input.benchlingClientId && input.benchlingClientSecret) {
188
+ clientId = input.benchlingClientId;
189
+ clientSecret = input.benchlingClientSecret;
190
+ console.log(` Client ID: ${clientId.substring(0, 8)}... (from CLI)`);
191
+ console.log(" Client Secret: ******** (from CLI)");
192
+ }
193
+ else if (yes) {
194
+ // In non-interactive mode, use existing config or error
195
+ if (existingConfig?.benchling?.clientId && existingConfig?.benchling?.clientSecret && shouldReuseApp) {
196
+ clientId = existingConfig.benchling.clientId;
197
+ clientSecret = existingConfig.benchling.clientSecret;
198
+ console.log(` Client ID: ${clientId.substring(0, 8)}... (from existing config)`);
199
+ console.log(" Client Secret: ******** (from existing config)");
200
+ }
201
+ else {
202
+ throw new Error("--benchling-client-id and --benchling-client-secret are required in non-interactive mode");
203
+ }
204
+ }
205
+ else {
206
+ // Always show prompts with defaults from existing config (only if reusing app)
207
+ const hasExistingCreds = shouldReuseApp && existingConfig?.benchling?.clientId && existingConfig?.benchling?.clientSecret;
208
+ const credentialAnswers = await inquirer_1.default.prompt([
209
+ {
210
+ type: "input",
211
+ name: "clientId",
212
+ message: "Benchling OAuth Client ID:",
213
+ default: hasExistingCreds ? existingConfig?.benchling?.clientId : "",
214
+ validate: (value) => value.trim().length > 0 || "Client ID is required",
215
+ },
216
+ {
217
+ type: "password",
218
+ name: "clientSecret",
219
+ message: "Benchling OAuth Client Secret" +
220
+ (hasExistingCreds ? " (press Enter to keep existing):" : ":"),
221
+ default: hasExistingCreds ? existingConfig?.benchling?.clientSecret : "",
222
+ validate: (value) => {
223
+ // Allow empty input if we have existing credentials (will use default)
224
+ if (hasExistingCreds && value.trim().length === 0) {
225
+ return true;
226
+ }
227
+ return value.trim().length > 0 || "Client secret is required";
228
+ },
229
+ },
230
+ ]);
231
+ clientId = credentialAnswers.clientId;
232
+ // If user pressed Enter with empty input and we have existing creds, use the existing secret
233
+ clientSecret = credentialAnswers.clientSecret.trim() === "" && hasExistingCreds
234
+ ? existingConfig.benchling.clientSecret
235
+ : credentialAnswers.clientSecret;
236
+ }
237
+ // Test Entry ID (optional) - can be reused even when creating new app
238
+ let testEntryId;
239
+ if (input.benchlingTestEntryId) {
240
+ testEntryId = input.benchlingTestEntryId;
241
+ console.log(` Test Entry ID: ${testEntryId} (from CLI)`);
242
+ }
243
+ else if (yes) {
244
+ // In non-interactive mode, use existing config if available
245
+ testEntryId = existingConfig?.benchling?.testEntryId;
246
+ if (testEntryId) {
247
+ console.log(` Test Entry ID: ${testEntryId} (from existing config)`);
248
+ }
249
+ }
250
+ else {
251
+ // Always show prompt with default from existing config (even for new apps)
252
+ const existingTestEntryId = existingConfig?.benchling?.testEntryId;
253
+ const testEntryAnswer = await inquirer_1.default.prompt([
254
+ {
255
+ type: "input",
256
+ name: "testEntryId",
257
+ message: "Benchling Test Entry ID (optional)" +
258
+ (existingTestEntryId ? " (press Enter to keep existing):" : ":"),
259
+ default: existingTestEntryId || "",
260
+ },
261
+ ]);
262
+ // Accept both empty (to keep existing) and new values
263
+ if (testEntryAnswer.testEntryId && testEntryAnswer.testEntryId.trim() !== "") {
264
+ testEntryId = testEntryAnswer.testEntryId.trim();
265
+ }
266
+ else if (existingTestEntryId) {
267
+ // User pressed Enter with existing value - keep it
268
+ testEntryId = existingTestEntryId;
269
+ }
270
+ }
271
+ // =========================================================================
272
+ // Package Configuration
273
+ // =========================================================================
274
+ console.log("\n" + chalk_1.default.cyan("Package Configuration:"));
275
+ let bucket;
276
+ let prefix;
277
+ let metadataKey;
278
+ if (input.userBucket && input.pkgPrefix && input.pkgKey) {
279
+ bucket = input.userBucket;
280
+ prefix = input.pkgPrefix;
281
+ metadataKey = input.pkgKey;
282
+ console.log(` Bucket: ${bucket} (from CLI)`);
283
+ console.log(` Prefix: ${prefix} (from CLI)`);
284
+ console.log(` Metadata Key: ${metadataKey} (from CLI)`);
285
+ }
286
+ else if (yes) {
287
+ // In non-interactive mode, use CLI args or existing config or error
288
+ bucket = input.userBucket || existingConfig?.packages?.bucket || "";
289
+ prefix = input.pkgPrefix || existingConfig?.packages?.prefix || "benchling";
290
+ metadataKey = input.pkgKey || existingConfig?.packages?.metadataKey || "experiment_id";
291
+ if (!bucket) {
292
+ throw new Error("--user-bucket is required in non-interactive mode");
293
+ }
294
+ console.log(` Bucket: ${bucket} (from ${input.userBucket ? 'CLI' : 'existing config'})`);
295
+ console.log(` Prefix: ${prefix} (from ${input.pkgPrefix ? 'CLI' : existingConfig?.packages?.prefix ? 'existing config' : 'default'})`);
296
+ console.log(` Metadata Key: ${metadataKey} (from ${input.pkgKey ? 'CLI' : existingConfig?.packages?.metadataKey ? 'existing config' : 'default'})`);
297
+ }
298
+ else {
299
+ // Always show prompts with defaults from existing config
300
+ const packageAnswers = await inquirer_1.default.prompt([
301
+ {
302
+ type: "input",
303
+ name: "bucket",
304
+ message: "Package S3 Bucket:",
305
+ default: existingConfig?.packages?.bucket || "",
306
+ validate: (value) => value.trim().length > 0 || "Bucket name is required",
307
+ },
308
+ {
309
+ type: "input",
310
+ name: "prefix",
311
+ message: "Package S3 prefix:",
312
+ default: existingConfig?.packages?.prefix || "benchling",
313
+ },
314
+ {
315
+ type: "input",
316
+ name: "metadataKey",
317
+ message: "Package metadata key:",
318
+ default: existingConfig?.packages?.metadataKey || "experiment_id",
319
+ },
320
+ ]);
321
+ bucket = packageAnswers.bucket;
322
+ prefix = packageAnswers.prefix;
323
+ metadataKey = packageAnswers.metadataKey;
324
+ }
325
+ // =========================================================================
326
+ // Deployment Configuration
327
+ // =========================================================================
328
+ console.log("\n" + chalk_1.default.cyan("Deployment Configuration:"));
329
+ const region = stackQuery.region;
330
+ const account = stackQuery.account;
331
+ console.log(` Region: ${region} (from stack)`);
332
+ console.log(` Account: ${account} (from stack)`);
333
+ // =========================================================================
334
+ // Optional Configuration
335
+ // =========================================================================
336
+ console.log("\n" + chalk_1.default.cyan("Optional Configuration:"));
337
+ let logLevel;
338
+ let webhookAllowList;
339
+ if (input.logLevel && input.webhookAllowList !== undefined) {
340
+ logLevel = input.logLevel;
341
+ webhookAllowList = input.webhookAllowList;
342
+ console.log(` Log Level: ${logLevel} (from CLI)`);
343
+ console.log(` Webhook Allow List: ${webhookAllowList || "(none)"} (from CLI)`);
344
+ }
345
+ else if (yes) {
346
+ // In non-interactive mode, use CLI args or existing config or defaults
347
+ logLevel = input.logLevel || existingConfig?.logging?.level || "INFO";
348
+ webhookAllowList = input.webhookAllowList ?? existingConfig?.security?.webhookAllowList ?? "";
349
+ console.log(` Log Level: ${logLevel} (from ${input.logLevel ? 'CLI' : existingConfig?.logging?.level ? 'existing config' : 'default'})`);
350
+ console.log(` Webhook Allow List: ${webhookAllowList || "(none)"} (from ${input.webhookAllowList !== undefined ? 'CLI' : existingConfig?.security?.webhookAllowList ? 'existing config' : 'default'})`);
351
+ }
352
+ else {
353
+ // Always show prompts with defaults from existing config
354
+ const optionalAnswers = await inquirer_1.default.prompt([
355
+ {
356
+ type: "list",
357
+ name: "logLevel",
358
+ message: "Log level:",
359
+ choices: ["DEBUG", "INFO", "WARNING", "ERROR"],
360
+ default: existingConfig?.logging?.level || "INFO",
361
+ },
362
+ {
363
+ type: "input",
364
+ name: "webhookAllowList",
365
+ message: "Webhook IP allowlist (comma-separated, empty for none):",
366
+ default: existingConfig?.security?.webhookAllowList || "",
367
+ },
368
+ ]);
369
+ logLevel = optionalAnswers.logLevel;
370
+ webhookAllowList = optionalAnswers.webhookAllowList;
371
+ }
372
+ console.log(""); // Empty line for spacing
373
+ return {
374
+ benchling: {
375
+ tenant,
376
+ clientId,
377
+ clientSecret,
378
+ appDefinitionId,
379
+ testEntryId,
380
+ },
381
+ packages: {
382
+ bucket,
383
+ prefix,
384
+ metadataKey,
385
+ },
386
+ deployment: {
387
+ region,
388
+ account,
389
+ },
390
+ logging: {
391
+ level: logLevel,
392
+ },
393
+ security: {
394
+ enableVerification: true,
395
+ webhookAllowList,
396
+ },
397
+ };
398
+ }
399
+ //# sourceMappingURL=phase3-parameter-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase3-parameter-collection.js","sourceRoot":"","sources":["../../../lib/wizard/phase3-parameter-collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Phase 4: Validation
3
+ *
4
+ * Validates all collected parameters before proceeding to mode decision.
5
+ *
6
+ * @module wizard/phase4-validation
7
+ */
8
+ import { ValidationInput, ValidationResult } from "./types";
9
+ /**
10
+ * Phase 4: Validation
11
+ *
12
+ * Responsibilities:
13
+ * - Validate Benchling credentials (OAuth test)
14
+ * - Validate S3 bucket access
15
+ * - Validate app definition ID exists
16
+ * - Return validation result with errors
17
+ *
18
+ * @param input - Validation input
19
+ * @returns Validation result
20
+ */
21
+ export declare function runValidation(input: ValidationInput): Promise<ValidationResult>;
22
+ //# sourceMappingURL=phase4-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase4-validation.d.ts","sourceRoot":"","sources":["../../../lib/wizard/phase4-validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAsO5D;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4DrF"}