@quiltdata/benchling-webhook 0.6.3-20251104T170954Z → 0.7.2-20251106T003353Z

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 (141) hide show
  1. package/README.md +166 -5
  2. package/dist/bin/benchling-webhook.d.ts +2 -16
  3. package/dist/bin/benchling-webhook.d.ts.map +1 -1
  4. package/dist/bin/benchling-webhook.js +98 -158
  5. package/dist/bin/benchling-webhook.js.map +1 -1
  6. package/dist/bin/cli.js +96 -8
  7. package/dist/bin/cli.js.map +1 -1
  8. package/dist/bin/{config-profiles.d.ts → commands/config-profiles.d.ts} +10 -9
  9. package/dist/bin/commands/config-profiles.d.ts.map +1 -0
  10. package/dist/bin/{config-profiles.js → commands/config-profiles.js} +110 -102
  11. package/dist/bin/commands/config-profiles.js.map +1 -0
  12. package/dist/bin/commands/create-secret.d.ts.map +1 -0
  13. package/dist/bin/commands/create-secret.js.map +1 -0
  14. package/dist/bin/commands/deploy.d.ts +11 -0
  15. package/dist/bin/commands/deploy.d.ts.map +1 -1
  16. package/dist/bin/commands/deploy.js +65 -110
  17. package/dist/bin/commands/deploy.js.map +1 -1
  18. package/dist/bin/{get-env.d.ts → commands/get-env.d.ts} +1 -1
  19. package/dist/bin/commands/get-env.d.ts.map +1 -0
  20. package/dist/bin/{get-env.js → commands/get-env.js} +2 -2
  21. package/dist/bin/commands/get-env.js.map +1 -0
  22. package/dist/bin/commands/health-check.d.ts +47 -0
  23. package/dist/bin/commands/health-check.d.ts.map +1 -0
  24. package/dist/bin/commands/health-check.js +357 -0
  25. package/dist/bin/commands/health-check.js.map +1 -0
  26. package/dist/bin/commands/infer-quilt-config.d.ts +50 -0
  27. package/dist/bin/commands/infer-quilt-config.d.ts.map +1 -0
  28. package/dist/bin/commands/infer-quilt-config.js +356 -0
  29. package/dist/bin/commands/infer-quilt-config.js.map +1 -0
  30. package/dist/bin/commands/init.d.ts.map +1 -1
  31. package/dist/bin/commands/init.js +2 -32
  32. package/dist/bin/commands/init.js.map +1 -1
  33. package/dist/bin/commands/manifest.d.ts +11 -0
  34. package/dist/bin/commands/manifest.d.ts.map +1 -1
  35. package/dist/bin/commands/manifest.js +22 -8
  36. package/dist/bin/commands/manifest.js.map +1 -1
  37. package/dist/bin/commands/publish.d.ts.map +1 -0
  38. package/dist/bin/{publish.js → commands/publish.js} +2 -2
  39. package/dist/bin/commands/publish.js.map +1 -0
  40. package/dist/bin/commands/setup-profile.d.ts +29 -0
  41. package/dist/bin/commands/setup-profile.d.ts.map +1 -0
  42. package/dist/bin/commands/setup-profile.js +220 -0
  43. package/dist/bin/commands/setup-profile.js.map +1 -0
  44. package/dist/bin/commands/setup-wizard.d.ts +26 -11
  45. package/dist/bin/commands/setup-wizard.d.ts.map +1 -1
  46. package/dist/bin/commands/setup-wizard.js +844 -46
  47. package/dist/bin/commands/setup-wizard.js.map +1 -1
  48. package/dist/{scripts → bin/commands}/sync-secrets.d.ts +6 -1
  49. package/dist/bin/commands/sync-secrets.d.ts.map +1 -0
  50. package/dist/{scripts → bin/commands}/sync-secrets.js +159 -55
  51. package/dist/bin/commands/sync-secrets.js.map +1 -0
  52. package/dist/bin/commands/validate.d.ts.map +1 -1
  53. package/dist/bin/commands/validate.js +2 -12
  54. package/dist/bin/commands/validate.js.map +1 -1
  55. package/dist/lib/alb-api-gateway.d.ts +7 -1
  56. package/dist/lib/alb-api-gateway.d.ts.map +1 -1
  57. package/dist/lib/alb-api-gateway.js +9 -6
  58. package/dist/lib/alb-api-gateway.js.map +1 -1
  59. package/dist/lib/benchling-webhook-stack.d.ts +13 -12
  60. package/dist/lib/benchling-webhook-stack.d.ts.map +1 -1
  61. package/dist/lib/benchling-webhook-stack.js +43 -30
  62. package/dist/lib/benchling-webhook-stack.js.map +1 -1
  63. package/dist/lib/configuration-saver.d.ts +4 -16
  64. package/dist/lib/configuration-saver.d.ts.map +1 -1
  65. package/dist/lib/configuration-saver.js +14 -54
  66. package/dist/lib/configuration-saver.js.map +1 -1
  67. package/dist/lib/fargate-service.d.ts +11 -21
  68. package/dist/lib/fargate-service.d.ts.map +1 -1
  69. package/dist/lib/fargate-service.js +79 -176
  70. package/dist/lib/fargate-service.js.map +1 -1
  71. package/dist/lib/types/config.d.ts +591 -224
  72. package/dist/lib/types/config.d.ts.map +1 -1
  73. package/dist/lib/types/config.js +134 -3
  74. package/dist/lib/types/config.js.map +1 -1
  75. package/dist/lib/utils/config.d.ts.map +1 -1
  76. package/dist/lib/utils/config.js.map +1 -1
  77. package/dist/lib/xdg-config.d.ts +222 -106
  78. package/dist/lib/xdg-config.d.ts.map +1 -1
  79. package/dist/lib/xdg-config.js +448 -387
  80. package/dist/lib/xdg-config.js.map +1 -1
  81. package/dist/package.json +16 -13
  82. package/dist/scripts/check-logs.d.ts +12 -0
  83. package/dist/scripts/check-logs.d.ts.map +1 -0
  84. package/dist/{bin → scripts}/check-logs.js +65 -15
  85. package/dist/scripts/check-logs.js.map +1 -0
  86. package/dist/scripts/check-webhook-verification.d.ts +3 -0
  87. package/dist/scripts/check-webhook-verification.d.ts.map +1 -0
  88. package/dist/{bin/test-invalid-signature.js → scripts/check-webhook-verification.js} +1 -1
  89. package/dist/scripts/check-webhook-verification.js.map +1 -0
  90. package/dist/scripts/infer-quilt-config.d.ts +23 -26
  91. package/dist/scripts/infer-quilt-config.d.ts.map +1 -1
  92. package/dist/scripts/infer-quilt-config.js +58 -96
  93. package/dist/scripts/infer-quilt-config.js.map +1 -1
  94. package/dist/scripts/send-event.d.ts.map +1 -0
  95. package/dist/scripts/send-event.js.map +1 -0
  96. package/dist/{bin → scripts}/version.d.ts +3 -1
  97. package/dist/scripts/version.d.ts.map +1 -0
  98. package/dist/{bin → scripts}/version.js +95 -9
  99. package/dist/scripts/version.js.map +1 -0
  100. package/package.json +16 -13
  101. package/dist/bin/check-logs.d.ts +0 -7
  102. package/dist/bin/check-logs.d.ts.map +0 -1
  103. package/dist/bin/check-logs.js.map +0 -1
  104. package/dist/bin/config-profiles.d.ts.map +0 -1
  105. package/dist/bin/config-profiles.js.map +0 -1
  106. package/dist/bin/create-secret.d.ts.map +0 -1
  107. package/dist/bin/create-secret.js.map +0 -1
  108. package/dist/bin/dev-deploy.d.ts +0 -20
  109. package/dist/bin/dev-deploy.d.ts.map +0 -1
  110. package/dist/bin/dev-deploy.js +0 -289
  111. package/dist/bin/dev-deploy.js.map +0 -1
  112. package/dist/bin/get-env.d.ts.map +0 -1
  113. package/dist/bin/get-env.js.map +0 -1
  114. package/dist/bin/publish.d.ts.map +0 -1
  115. package/dist/bin/publish.js.map +0 -1
  116. package/dist/bin/release.d.ts +0 -11
  117. package/dist/bin/release.d.ts.map +0 -1
  118. package/dist/bin/release.js +0 -141
  119. package/dist/bin/release.js.map +0 -1
  120. package/dist/bin/send-event.d.ts.map +0 -1
  121. package/dist/bin/send-event.js.map +0 -1
  122. package/dist/bin/test-invalid-signature.d.ts +0 -3
  123. package/dist/bin/test-invalid-signature.d.ts.map +0 -1
  124. package/dist/bin/test-invalid-signature.js.map +0 -1
  125. package/dist/bin/version.d.ts.map +0 -1
  126. package/dist/bin/version.js.map +0 -1
  127. package/dist/scripts/config-health-check.d.ts +0 -84
  128. package/dist/scripts/config-health-check.d.ts.map +0 -1
  129. package/dist/scripts/config-health-check.js +0 -659
  130. package/dist/scripts/config-health-check.js.map +0 -1
  131. package/dist/scripts/install-wizard.d.ts +0 -34
  132. package/dist/scripts/install-wizard.d.ts.map +0 -1
  133. package/dist/scripts/install-wizard.js +0 -719
  134. package/dist/scripts/install-wizard.js.map +0 -1
  135. package/dist/scripts/sync-secrets.d.ts.map +0 -1
  136. package/dist/scripts/sync-secrets.js.map +0 -1
  137. /package/dist/bin/{create-secret.d.ts → commands/create-secret.d.ts} +0 -0
  138. /package/dist/bin/{create-secret.js → commands/create-secret.js} +0 -0
  139. /package/dist/bin/{publish.d.ts → commands/publish.d.ts} +0 -0
  140. /package/dist/{bin → scripts}/send-event.d.ts +0 -0
  141. /package/dist/{bin → scripts}/send-event.js +0 -0
@@ -1,659 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- /**
4
- * Configuration Health Checks
5
- *
6
- * Validates:
7
- * - XDG configuration integrity
8
- * - Secrets accessibility
9
- * - Benchling credential freshness
10
- * - AWS resource connectivity
11
- *
12
- * @module scripts/config-health-check
13
- */
14
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- var desc = Object.getOwnPropertyDescriptor(m, k);
17
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
- desc = { enumerable: true, get: function() { return m[k]; } };
19
- }
20
- Object.defineProperty(o, k2, desc);
21
- }) : (function(o, m, k, k2) {
22
- if (k2 === undefined) k2 = k;
23
- o[k2] = m[k];
24
- }));
25
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
- Object.defineProperty(o, "default", { enumerable: true, value: v });
27
- }) : function(o, v) {
28
- o["default"] = v;
29
- });
30
- var __importStar = (this && this.__importStar) || (function () {
31
- var ownKeys = function(o) {
32
- ownKeys = Object.getOwnPropertyNames || function (o) {
33
- var ar = [];
34
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
- return ar;
36
- };
37
- return ownKeys(o);
38
- };
39
- return function (mod) {
40
- if (mod && mod.__esModule) return mod;
41
- var result = {};
42
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
- __setModuleDefault(result, mod);
44
- return result;
45
- };
46
- })();
47
- Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.ConfigHealthChecker = void 0;
49
- const xdg_config_1 = require("../lib/xdg-config");
50
- const fs_1 = require("fs");
51
- const sync_secrets_1 = require("./sync-secrets");
52
- const config_logger_1 = require("../lib/config-logger");
53
- const https = __importStar(require("https"));
54
- const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
55
- /**
56
- * Configuration health checker
57
- */
58
- class ConfigHealthChecker {
59
- constructor(profile = "default") {
60
- this.logger = new config_logger_1.ConfigLogger({ minLogLevel: config_logger_1.LogLevel.INFO });
61
- this.xdgConfig = new xdg_config_1.XDGConfig();
62
- this.profile = profile;
63
- }
64
- /**
65
- * Checks XDG configuration file integrity
66
- *
67
- * @returns Health check result
68
- */
69
- async checkXDGIntegrity() {
70
- try {
71
- const paths = this.xdgConfig.getProfilePaths(this.profile);
72
- // Check if profile directory exists
73
- const profileDir = this.xdgConfig.getProfileDir(this.profile);
74
- if (!(0, fs_1.existsSync)(profileDir)) {
75
- return {
76
- check: "xdg-integrity",
77
- status: "fail",
78
- message: "Profile directory does not exist",
79
- details: {
80
- profileDir,
81
- profile: this.profile,
82
- },
83
- };
84
- }
85
- // Check for configuration files
86
- const files = {
87
- userConfig: (0, fs_1.existsSync)(paths.userConfig),
88
- derivedConfig: (0, fs_1.existsSync)(paths.derivedConfig),
89
- deployConfig: (0, fs_1.existsSync)(paths.deployConfig),
90
- };
91
- // At least user or derived config should exist
92
- if (!files.userConfig && !files.derivedConfig) {
93
- return {
94
- check: "xdg-integrity",
95
- status: "warn",
96
- message: "No configuration files found",
97
- details: {
98
- ...files,
99
- profile: this.profile,
100
- },
101
- };
102
- }
103
- // Try to read and validate existing configs
104
- if (files.userConfig) {
105
- try {
106
- this.xdgConfig.readProfileConfig("user", this.profile);
107
- }
108
- catch (error) {
109
- return {
110
- check: "xdg-integrity",
111
- status: "fail",
112
- message: `User config validation failed: ${error.message}`,
113
- details: {
114
- profile: this.profile,
115
- error: error.message,
116
- },
117
- };
118
- }
119
- }
120
- if (files.derivedConfig) {
121
- try {
122
- this.xdgConfig.readProfileConfig("derived", this.profile);
123
- }
124
- catch (error) {
125
- return {
126
- check: "xdg-integrity",
127
- status: "fail",
128
- message: `Derived config validation failed: ${error.message}`,
129
- details: {
130
- profile: this.profile,
131
- error: error.message,
132
- },
133
- };
134
- }
135
- }
136
- return {
137
- check: "xdg-integrity",
138
- status: "pass",
139
- message: "XDG configuration integrity verified",
140
- details: {
141
- ...files,
142
- profile: this.profile,
143
- },
144
- };
145
- }
146
- catch (error) {
147
- return {
148
- check: "xdg-integrity",
149
- status: "fail",
150
- message: `Integrity check failed: ${error.message}`,
151
- details: {
152
- error: error.message,
153
- },
154
- };
155
- }
156
- }
157
- /**
158
- * Checks AWS Secrets Manager accessibility
159
- *
160
- * @returns Health check result
161
- */
162
- async checkSecretsAccess() {
163
- try {
164
- // Load derived config to get secret ARN
165
- const derivedConfig = this.xdgConfig.readProfileConfig("derived", this.profile);
166
- if (!derivedConfig.benchlingSecretArn) {
167
- return {
168
- check: "secrets-access",
169
- status: "warn",
170
- message: "No secrets configured",
171
- details: {
172
- profile: this.profile,
173
- recommendation: "Run sync-secrets to configure AWS Secrets Manager",
174
- },
175
- };
176
- }
177
- // Validate secrets accessibility
178
- const isAccessible = await (0, sync_secrets_1.validateSecretsAccess)({
179
- profile: this.profile,
180
- region: derivedConfig.cdkRegion || "us-east-1",
181
- awsProfile: derivedConfig.awsProfile,
182
- });
183
- if (isAccessible) {
184
- return {
185
- check: "secrets-access",
186
- status: "pass",
187
- message: "Secrets accessible",
188
- details: {
189
- secretArn: derivedConfig.benchlingSecretArn,
190
- profile: this.profile,
191
- },
192
- };
193
- }
194
- else {
195
- return {
196
- check: "secrets-access",
197
- status: "fail",
198
- message: "Secrets not accessible",
199
- details: {
200
- secretArn: derivedConfig.benchlingSecretArn,
201
- profile: this.profile,
202
- recommendation: "Check AWS credentials and IAM permissions",
203
- },
204
- };
205
- }
206
- }
207
- catch (error) {
208
- return {
209
- check: "secrets-access",
210
- status: "fail",
211
- message: `Secrets access check failed: ${error.message}`,
212
- details: {
213
- error: error.message,
214
- },
215
- };
216
- }
217
- }
218
- /**
219
- * Checks Benchling credential freshness
220
- *
221
- * @returns Health check result
222
- */
223
- async checkBenchlingCredentials() {
224
- try {
225
- const userConfig = this.xdgConfig.readProfileConfig("user", this.profile);
226
- if (!userConfig.benchlingTenant) {
227
- return {
228
- check: "benchling-credentials",
229
- status: "warn",
230
- message: "No Benchling tenant configured",
231
- details: {
232
- profile: this.profile,
233
- },
234
- };
235
- }
236
- // Check tenant accessibility
237
- const tenantUrl = `https://${userConfig.benchlingTenant}.benchling.com`;
238
- return new Promise((resolve) => {
239
- https
240
- .get(tenantUrl, { timeout: 5000 }, (res) => {
241
- if (res.statusCode === 200 || res.statusCode === 302 || res.statusCode === 301) {
242
- resolve({
243
- check: "benchling-credentials",
244
- status: "pass",
245
- message: "Benchling tenant accessible",
246
- details: {
247
- tenant: userConfig.benchlingTenant,
248
- tenantUrl,
249
- },
250
- });
251
- }
252
- else {
253
- resolve({
254
- check: "benchling-credentials",
255
- status: "warn",
256
- message: `Tenant returned status ${res.statusCode}`,
257
- details: {
258
- tenant: userConfig.benchlingTenant,
259
- statusCode: res.statusCode,
260
- },
261
- });
262
- }
263
- })
264
- .on("error", (error) => {
265
- resolve({
266
- check: "benchling-credentials",
267
- status: "fail",
268
- message: `Tenant not accessible: ${error.message}`,
269
- details: {
270
- tenant: userConfig.benchlingTenant,
271
- error: error.message,
272
- },
273
- });
274
- });
275
- });
276
- }
277
- catch (error) {
278
- return {
279
- check: "benchling-credentials",
280
- status: "fail",
281
- message: `Credential check failed: ${error.message}`,
282
- details: {
283
- error: error.message,
284
- },
285
- };
286
- }
287
- }
288
- /**
289
- * Checks Quilt catalog configuration
290
- *
291
- * @returns Health check result
292
- */
293
- async checkQuiltCatalog() {
294
- try {
295
- const userConfig = this.xdgConfig.readProfileConfig("user", this.profile);
296
- const catalogUrl = userConfig.quiltCatalog;
297
- if (!catalogUrl) {
298
- return {
299
- check: "quilt-catalog",
300
- status: "warn",
301
- message: "No Quilt catalog configured",
302
- details: {
303
- profile: this.profile,
304
- recommendation: "Run npm run setup:infer or npm run setup",
305
- },
306
- };
307
- }
308
- // Verify required Quilt configuration fields are present
309
- const missingFields = [];
310
- if (!userConfig.quiltStackArn) {
311
- missingFields.push("quiltStackArn");
312
- }
313
- if (!userConfig.benchlingPkgBucket && !userConfig.quiltUserBucket) {
314
- missingFields.push("benchlingPkgBucket or quiltUserBucket");
315
- }
316
- if (missingFields.length > 0) {
317
- return {
318
- check: "quilt-catalog",
319
- status: "warn",
320
- message: `Incomplete Quilt configuration: missing ${missingFields.join(", ")}`,
321
- details: {
322
- catalogUrl,
323
- missingFields,
324
- recommendation: "Run npm run setup:infer to complete configuration",
325
- },
326
- };
327
- }
328
- return {
329
- check: "quilt-catalog",
330
- status: "pass",
331
- message: "Quilt catalog configured",
332
- details: {
333
- catalogUrl,
334
- stackArn: userConfig.quiltStackArn,
335
- bucket: userConfig.benchlingPkgBucket || userConfig.quiltUserBucket,
336
- },
337
- };
338
- }
339
- catch (error) {
340
- return {
341
- check: "quilt-catalog",
342
- status: "fail",
343
- message: `Catalog check failed: ${error.message}`,
344
- details: {
345
- error: error.message,
346
- },
347
- };
348
- }
349
- }
350
- /**
351
- * Checks if local config and remote secrets are in sync
352
- *
353
- * @returns Health check result
354
- */
355
- async checkSecretsSync() {
356
- try {
357
- const paths = this.xdgConfig.getProfilePaths(this.profile);
358
- // Check if user config exists
359
- if (!(0, fs_1.existsSync)(paths.userConfig)) {
360
- return {
361
- check: "secrets-sync",
362
- status: "warn",
363
- message: "No user configuration found",
364
- details: {
365
- profile: this.profile,
366
- },
367
- };
368
- }
369
- // Load derived config to get secret ARN
370
- const derivedConfig = this.xdgConfig.readProfileConfig("derived", this.profile);
371
- if (!derivedConfig.benchlingSecretArn) {
372
- return {
373
- check: "secrets-sync",
374
- status: "warn",
375
- message: "No secrets configured",
376
- details: {
377
- profile: this.profile,
378
- recommendation: "Run npm run setup:sync-secrets to sync secrets",
379
- },
380
- };
381
- }
382
- // Get local config modification time
383
- const userConfigStats = (0, fs_1.statSync)(paths.userConfig);
384
- const localModifiedAt = userConfigStats.mtime;
385
- // Get remote secret modification time
386
- const region = derivedConfig.cdkRegion || "us-east-1";
387
- const clientConfig = { region };
388
- if (derivedConfig.awsProfile) {
389
- const { fromIni } = await Promise.resolve().then(() => __importStar(require("@aws-sdk/credential-providers")));
390
- clientConfig.credentials = fromIni({ profile: derivedConfig.awsProfile });
391
- }
392
- const client = new client_secrets_manager_1.SecretsManagerClient(clientConfig);
393
- const command = new client_secrets_manager_1.DescribeSecretCommand({ SecretId: derivedConfig.benchlingSecretArn });
394
- const secretMetadata = await client.send(command);
395
- if (!secretMetadata.LastChangedDate) {
396
- return {
397
- check: "secrets-sync",
398
- status: "warn",
399
- message: "Cannot determine secret modification time",
400
- details: {
401
- secretArn: derivedConfig.benchlingSecretArn,
402
- },
403
- };
404
- }
405
- const remoteModifiedAt = secretMetadata.LastChangedDate;
406
- // Compare times (allow 1 second tolerance for filesystem precision)
407
- const timeDiffMs = Math.abs(localModifiedAt.getTime() - remoteModifiedAt.getTime());
408
- const timeDiffSeconds = Math.floor(timeDiffMs / 1000);
409
- if (localModifiedAt > remoteModifiedAt && timeDiffMs > 1000) {
410
- // Local is newer - secrets need to be synced
411
- const ageMinutes = Math.floor(timeDiffMs / (1000 * 60));
412
- const ageHours = Math.floor(ageMinutes / 60);
413
- const ageDays = Math.floor(ageHours / 24);
414
- let ageDescription;
415
- if (ageDays > 0) {
416
- ageDescription = `${ageDays} day${ageDays > 1 ? "s" : ""}`;
417
- }
418
- else if (ageHours > 0) {
419
- ageDescription = `${ageHours} hour${ageHours > 1 ? "s" : ""}`;
420
- }
421
- else {
422
- ageDescription = `${ageMinutes} minute${ageMinutes > 1 ? "s" : ""}`;
423
- }
424
- return {
425
- check: "secrets-sync",
426
- status: "warn",
427
- message: `Local config is ${ageDescription} newer than remote secrets`,
428
- details: {
429
- localModifiedAt: localModifiedAt.toISOString(),
430
- remoteModifiedAt: remoteModifiedAt.toISOString(),
431
- timeDiffSeconds,
432
- recommendation: "Run npm run setup:sync-secrets --force to sync changes",
433
- },
434
- };
435
- }
436
- return {
437
- check: "secrets-sync",
438
- status: "pass",
439
- message: "Local config and remote secrets are in sync",
440
- details: {
441
- localModifiedAt: localModifiedAt.toISOString(),
442
- remoteModifiedAt: remoteModifiedAt.toISOString(),
443
- timeDiffSeconds,
444
- },
445
- };
446
- }
447
- catch (error) {
448
- return {
449
- check: "secrets-sync",
450
- status: "fail",
451
- message: `Sync check failed: ${error.message}`,
452
- details: {
453
- error: error.message,
454
- },
455
- };
456
- }
457
- }
458
- /**
459
- * Checks deployment configuration
460
- *
461
- * @returns Health check result
462
- */
463
- async checkDeploymentConfig() {
464
- try {
465
- const paths = this.xdgConfig.getProfilePaths(this.profile);
466
- if (!(0, fs_1.existsSync)(paths.deployConfig)) {
467
- return {
468
- check: "deployment-config",
469
- status: "warn",
470
- message: "No deployment configuration found",
471
- details: {
472
- profile: this.profile,
473
- recommendation: "Deploy the stack to generate deployment configuration",
474
- },
475
- };
476
- }
477
- const deployConfig = this.xdgConfig.readProfileConfig("deploy", this.profile);
478
- // Check for webhook endpoint
479
- if (!deployConfig.webhookEndpoint && !deployConfig.webhookUrl) {
480
- return {
481
- check: "deployment-config",
482
- status: "warn",
483
- message: "Webhook endpoint not configured",
484
- details: {
485
- profile: this.profile,
486
- },
487
- };
488
- }
489
- // Check deployment age
490
- if (deployConfig.deployedAt) {
491
- const deployedDate = new Date(deployConfig.deployedAt);
492
- const ageInDays = (Date.now() - deployedDate.getTime()) / (1000 * 60 * 60 * 24);
493
- if (ageInDays > 30) {
494
- return {
495
- check: "deployment-config",
496
- status: "warn",
497
- message: `Deployment is ${Math.floor(ageInDays)} days old`,
498
- details: {
499
- deployedAt: deployConfig.deployedAt,
500
- ageInDays: Math.floor(ageInDays),
501
- recommendation: "Consider updating deployment",
502
- },
503
- };
504
- }
505
- }
506
- return {
507
- check: "deployment-config",
508
- status: "pass",
509
- message: "Deployment configuration valid",
510
- details: {
511
- webhookEndpoint: deployConfig.webhookEndpoint || deployConfig.webhookUrl,
512
- deployedAt: deployConfig.deployedAt,
513
- stackArn: deployConfig.stackArn,
514
- },
515
- };
516
- }
517
- catch (error) {
518
- return {
519
- check: "deployment-config",
520
- status: "fail",
521
- message: `Deployment check failed: ${error.message}`,
522
- details: {
523
- error: error.message,
524
- },
525
- };
526
- }
527
- }
528
- /**
529
- * Runs all health checks
530
- *
531
- * @returns Complete health status
532
- */
533
- async runAllChecks() {
534
- this.logger.info("health-check", `Running health checks for profile: ${this.profile}`);
535
- const checks = [];
536
- // Run all checks in parallel
537
- const results = await Promise.all([
538
- this.checkXDGIntegrity(),
539
- this.checkSecretsAccess(),
540
- this.checkSecretsSync(),
541
- this.checkBenchlingCredentials(),
542
- this.checkQuiltCatalog(),
543
- this.checkDeploymentConfig(),
544
- ]);
545
- checks.push(...results);
546
- // Determine overall status
547
- const failCount = checks.filter((c) => c.status === "fail").length;
548
- const warnCount = checks.filter((c) => c.status === "warn").length;
549
- let overall;
550
- if (failCount > 0) {
551
- overall = "unhealthy";
552
- }
553
- else if (warnCount > 0) {
554
- overall = "degraded";
555
- }
556
- else {
557
- overall = "healthy";
558
- }
559
- const status = {
560
- overall,
561
- checks,
562
- timestamp: new Date().toISOString(),
563
- profile: this.profile,
564
- };
565
- this.logger.info("health-check", `Health check completed: ${overall}`, {
566
- failCount,
567
- warnCount,
568
- passCount: checks.filter((c) => c.status === "pass").length,
569
- });
570
- return status;
571
- }
572
- }
573
- exports.ConfigHealthChecker = ConfigHealthChecker;
574
- /**
575
- * Formats health status for console output
576
- *
577
- * @param status - Health status
578
- * @returns Formatted string
579
- */
580
- function formatHealthStatus(status) {
581
- const lines = [];
582
- lines.push("╔═══════════════════════════════════════════════════════════╗");
583
- lines.push("║ Configuration Health Check ║");
584
- lines.push("╚═══════════════════════════════════════════════════════════╝");
585
- lines.push("");
586
- lines.push(`Profile: ${status.profile}`);
587
- lines.push(`Timestamp: ${status.timestamp}`);
588
- lines.push(`Overall Status: ${status.overall.toUpperCase()}`);
589
- lines.push("");
590
- lines.push("Checks:");
591
- for (const check of status.checks) {
592
- const icon = check.status === "pass" ? "✓" : check.status === "warn" ? "⚠" : "❌";
593
- lines.push(` ${icon} ${check.check}: ${check.message}`);
594
- if (check.details) {
595
- Object.entries(check.details).forEach(([key, value]) => {
596
- if (key !== "error" && key !== "recommendation") {
597
- lines.push(` ${key}: ${value}`);
598
- }
599
- });
600
- if (check.details.recommendation) {
601
- lines.push(` → ${check.details.recommendation}`);
602
- }
603
- }
604
- lines.push("");
605
- }
606
- return lines.join("\n");
607
- }
608
- /**
609
- * Main execution for CLI usage
610
- */
611
- async function main() {
612
- const args = process.argv.slice(2);
613
- let profile = "default";
614
- let outputFormat = "text";
615
- // Parse arguments
616
- for (let i = 0; i < args.length; i++) {
617
- if (args[i] === "--profile" && i + 1 < args.length) {
618
- profile = args[i + 1];
619
- i++;
620
- }
621
- else if (args[i] === "--json") {
622
- outputFormat = "json";
623
- }
624
- else if (args[i] === "--help") {
625
- console.log("Usage: config-health-check [options]");
626
- console.log("\nOptions:");
627
- console.log(" --profile <name> Configuration profile (default: default)");
628
- console.log(" --json Output in JSON format");
629
- console.log(" --help Show this help message");
630
- process.exit(0);
631
- }
632
- }
633
- const checker = new ConfigHealthChecker(profile);
634
- const status = await checker.runAllChecks();
635
- if (outputFormat === "json") {
636
- console.log(JSON.stringify(status, null, 2));
637
- }
638
- else {
639
- console.log(formatHealthStatus(status));
640
- }
641
- // Exit with appropriate code
642
- if (status.overall === "unhealthy") {
643
- process.exit(1);
644
- }
645
- else if (status.overall === "degraded") {
646
- process.exit(2);
647
- }
648
- else {
649
- process.exit(0);
650
- }
651
- }
652
- // Run main if executed directly
653
- if (require.main === module) {
654
- main().catch((error) => {
655
- console.error("Error:", error.message);
656
- process.exit(1);
657
- });
658
- }
659
- //# sourceMappingURL=config-health-check.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-health-check.js","sourceRoot":"","sources":["../../scripts/config-health-check.ts"],"names":[],"mappings":"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"}