@aifabrix/builder 2.44.5 → 2.44.6

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 (207) hide show
  1. package/.cursor/rules/cli-layout.mdc +1 -1
  2. package/.cursor/rules/project-rules.mdc +1 -1
  3. package/.npmrc.token +1 -1
  4. package/README.md +15 -23
  5. package/integration/hubspot-test/README.md +2 -0
  6. package/integration/hubspot-test/test.js +5 -3
  7. package/jest.projects.js +48 -2
  8. package/lib/api/controller-health.api.js +49 -0
  9. package/lib/api/dimension-values.api.js +82 -0
  10. package/lib/api/dimensions.api.js +114 -0
  11. package/lib/api/external-systems.api.js +1 -0
  12. package/lib/api/integration-clients.api.js +168 -0
  13. package/lib/api/types/dimension-values.types.js +28 -0
  14. package/lib/api/types/dimensions.types.js +31 -0
  15. package/lib/api/types/integration-clients.types.js +45 -0
  16. package/lib/api/validation-runner.js +46 -25
  17. package/lib/app/deploy-config.js +11 -1
  18. package/lib/app/deploy-status-display.js +3 -3
  19. package/lib/app/deploy.js +36 -14
  20. package/lib/app/display.js +15 -11
  21. package/lib/app/push.js +46 -23
  22. package/lib/app/register.js +1 -1
  23. package/lib/app/restart-display.js +95 -0
  24. package/lib/app/rotate-secret.js +1 -1
  25. package/lib/app/run-container-start.js +12 -6
  26. package/lib/app/run-env-compose.js +30 -1
  27. package/lib/app/run-helpers.js +44 -12
  28. package/lib/app/run-reload-sync.js +148 -0
  29. package/lib/app/run-resolve-image.js +51 -1
  30. package/lib/app/run.js +99 -73
  31. package/lib/build/index.js +75 -45
  32. package/lib/cli/doctor-check.js +117 -0
  33. package/lib/cli/index.js +8 -2
  34. package/lib/cli/infra-guided.js +445 -0
  35. package/lib/cli/setup-app.js +20 -2
  36. package/lib/cli/setup-auth.js +26 -0
  37. package/lib/cli/setup-dev-path-commands.js +50 -3
  38. package/lib/cli/setup-infra.js +134 -61
  39. package/lib/cli/setup-integration-client.js +182 -0
  40. package/lib/cli/setup-parameters.js +21 -2
  41. package/lib/cli/setup-platform.js +102 -0
  42. package/lib/cli/setup-secrets.js +18 -6
  43. package/lib/cli/setup-utility.js +78 -33
  44. package/lib/commands/datasource-capability-dimension-cli.js +128 -0
  45. package/lib/commands/datasource-capability-output.js +29 -0
  46. package/lib/commands/datasource-capability-relate-cli.js +140 -0
  47. package/lib/commands/datasource-capability.js +411 -0
  48. package/lib/commands/datasource-unified-test-cli.options.js +1 -1
  49. package/lib/commands/datasource.js +53 -13
  50. package/lib/commands/dev-down.js +3 -3
  51. package/lib/commands/dev-infra-gate.js +32 -0
  52. package/lib/commands/dev-init.js +13 -7
  53. package/lib/commands/dimension-value.js +179 -0
  54. package/lib/commands/dimension.js +330 -0
  55. package/lib/commands/integration-client.js +430 -0
  56. package/lib/commands/login-device.js +65 -30
  57. package/lib/commands/login.js +21 -10
  58. package/lib/commands/parameters-validate.js +78 -13
  59. package/lib/commands/repair-datasource-auto-rbac.js +166 -0
  60. package/lib/commands/repair-datasource-keys.js +10 -5
  61. package/lib/commands/repair-datasource.js +19 -7
  62. package/lib/commands/repair-env-template.js +4 -1
  63. package/lib/commands/repair-openapi-sync.js +172 -0
  64. package/lib/commands/repair-persist.js +102 -0
  65. package/lib/commands/repair-rbac-extract.js +27 -0
  66. package/lib/commands/repair-rbac-migrate.js +186 -0
  67. package/lib/commands/repair-rbac.js +214 -31
  68. package/lib/commands/repair-system-alignment.js +246 -0
  69. package/lib/commands/repair-system-permissions.js +168 -0
  70. package/lib/commands/repair.js +120 -338
  71. package/lib/commands/secure.js +1 -1
  72. package/lib/commands/setup-modes.js +455 -0
  73. package/lib/commands/setup-prompts.js +388 -0
  74. package/lib/commands/setup.js +149 -0
  75. package/lib/commands/teardown.js +228 -0
  76. package/lib/commands/up-common.js +79 -19
  77. package/lib/commands/up-dataplane.js +33 -11
  78. package/lib/commands/up-miso.js +7 -11
  79. package/lib/commands/upload.js +109 -23
  80. package/lib/commands/wizard-core-helpers.js +14 -11
  81. package/lib/commands/wizard-core.js +6 -5
  82. package/lib/commands/wizard-dataplane.js +2 -2
  83. package/lib/commands/wizard-entity-selection.js +4 -3
  84. package/lib/commands/wizard-headless.js +2 -1
  85. package/lib/commands/wizard.js +2 -1
  86. package/lib/constants/infra-compose-service-names.js +40 -0
  87. package/lib/core/env-reader.js +16 -3
  88. package/lib/core/secrets-admin-env.js +101 -0
  89. package/lib/core/secrets-ensure-infra.js +34 -1
  90. package/lib/core/secrets-ensure.js +88 -66
  91. package/lib/core/secrets-env-content.js +432 -0
  92. package/lib/core/secrets-env-write.js +27 -1
  93. package/lib/core/secrets-load.js +248 -0
  94. package/lib/core/secrets-names.js +32 -0
  95. package/lib/core/secrets.js +17 -757
  96. package/lib/datasource/capability/basic-exposure.js +76 -0
  97. package/lib/datasource/capability/capability-diff-slice.js +41 -0
  98. package/lib/datasource/capability/capability-key.js +34 -0
  99. package/lib/datasource/capability/capability-resolve.js +172 -0
  100. package/lib/datasource/capability/capability-storage-keys.js +22 -0
  101. package/lib/datasource/capability/copy-operations.js +348 -0
  102. package/lib/datasource/capability/copy-test-payload.js +139 -0
  103. package/lib/datasource/capability/create-operations.js +235 -0
  104. package/lib/datasource/capability/dimension-operations.js +151 -0
  105. package/lib/datasource/capability/dimension-validate.js +219 -0
  106. package/lib/datasource/capability/json-pointer.js +31 -0
  107. package/lib/datasource/capability/reference-rewrite.js +51 -0
  108. package/lib/datasource/capability/relate-operations.js +325 -0
  109. package/lib/datasource/capability/relate-validate.js +219 -0
  110. package/lib/datasource/capability/remove-operations.js +275 -0
  111. package/lib/datasource/capability/run-capability-copy.js +152 -0
  112. package/lib/datasource/capability/run-capability-diff.js +135 -0
  113. package/lib/datasource/capability/run-capability-dimension.js +291 -0
  114. package/lib/datasource/capability/run-capability-edit.js +377 -0
  115. package/lib/datasource/capability/run-capability-relate.js +193 -0
  116. package/lib/datasource/capability/run-capability-remove.js +105 -0
  117. package/lib/datasource/capability/templates/minimal-fetch.json +18 -0
  118. package/lib/datasource/capability/validate-capability-slice.js +35 -0
  119. package/lib/datasource/list.js +136 -23
  120. package/lib/datasource/log-viewer.js +2 -4
  121. package/lib/datasource/unified-validation-run.js +51 -16
  122. package/lib/datasource/validate.js +53 -1
  123. package/lib/deployment/deploy-poll-ui.js +60 -0
  124. package/lib/deployment/deployer-status.js +29 -3
  125. package/lib/deployment/deployer.js +48 -30
  126. package/lib/deployment/environment.js +7 -2
  127. package/lib/deployment/poll-interval.js +72 -0
  128. package/lib/deployment/push.js +11 -9
  129. package/lib/external-system/deploy.js +4 -1
  130. package/lib/external-system/download.js +61 -32
  131. package/lib/external-system/sync-deploy-manifest.js +33 -0
  132. package/lib/infrastructure/index.js +49 -19
  133. package/lib/infrastructure/orphan-infra-docker-teardown.js +177 -0
  134. package/lib/parameters/infra-kv-discovery.js +29 -4
  135. package/lib/parameters/infra-parameter-catalog.js +6 -3
  136. package/lib/parameters/infra-parameter-validate.js +67 -19
  137. package/lib/resolvers/datasource-resolver.js +53 -0
  138. package/lib/resolvers/dimension-file.js +52 -0
  139. package/lib/resolvers/manifest-resolver.js +133 -0
  140. package/lib/schema/external-datasource.schema.json +183 -53
  141. package/lib/schema/external-system.schema.json +23 -10
  142. package/lib/schema/infra.parameter.yaml +26 -11
  143. package/lib/schema/wizard-config.schema.json +1 -1
  144. package/lib/utils/aifabrix-config-dir-walk.js +40 -0
  145. package/lib/utils/aifabrix-runtime-config-dir.js +26 -3
  146. package/lib/utils/app-run-containers.js +2 -2
  147. package/lib/utils/bash-secret-env.js +59 -0
  148. package/lib/utils/cli-secrets-error-format.js +78 -0
  149. package/lib/utils/cli-test-layout-chalk.js +31 -9
  150. package/lib/utils/cli-utils.js +4 -36
  151. package/lib/utils/datasource-test-run-display.js +8 -0
  152. package/lib/utils/dev-hosts-helper.js +3 -2
  153. package/lib/utils/dev-init-ssh-merge.js +2 -1
  154. package/lib/utils/docker-build.js +17 -9
  155. package/lib/utils/docker-reload-mount.js +127 -0
  156. package/lib/utils/external-readme.js +71 -2
  157. package/lib/utils/external-system-local-test-tty.js +3 -2
  158. package/lib/utils/external-system-readiness-core.js +45 -12
  159. package/lib/utils/external-system-readiness-deploy-display.js +3 -3
  160. package/lib/utils/external-system-readiness-display-internals.js +33 -3
  161. package/lib/utils/external-system-readiness-display.js +10 -1
  162. package/lib/utils/file-upload.js +40 -3
  163. package/lib/utils/health-check-db-init.js +107 -0
  164. package/lib/utils/health-check-public-warn.js +69 -0
  165. package/lib/utils/health-check-url.js +19 -4
  166. package/lib/utils/health-check.js +135 -105
  167. package/lib/utils/help-builder.js +5 -1
  168. package/lib/utils/image-name.js +34 -7
  169. package/lib/utils/integration-file-backup.js +74 -0
  170. package/lib/utils/mutagen-install.js +30 -3
  171. package/lib/utils/paths.js +108 -25
  172. package/lib/utils/postgres-wipe.js +212 -0
  173. package/lib/utils/register-aifabrix-shell-env.js +15 -0
  174. package/lib/utils/remote-dev-auth.js +21 -5
  175. package/lib/utils/remote-docker-env.js +9 -1
  176. package/lib/utils/remote-secrets-loader.js +42 -3
  177. package/lib/utils/resolve-docker-image-ref.js +9 -3
  178. package/lib/utils/secrets-ancestor-paths.js +47 -0
  179. package/lib/utils/secrets-helpers.js +17 -10
  180. package/lib/utils/secrets-kv-refs.js +42 -0
  181. package/lib/utils/secrets-kv-scope.js +19 -2
  182. package/lib/utils/secrets-materialize-local.js +134 -0
  183. package/lib/utils/secrets-path.js +24 -10
  184. package/lib/utils/secrets-utils.js +2 -2
  185. package/lib/utils/system-builder-root.js +34 -0
  186. package/lib/utils/url-declarative-resolve-build.js +6 -1
  187. package/lib/utils/url-declarative-runtime-base-path.js +32 -0
  188. package/lib/utils/url-declarative-vdir-inactive-env.js +2 -1
  189. package/lib/utils/urls-local-registry.js +23 -12
  190. package/lib/utils/validation-poll-ui.js +81 -0
  191. package/lib/utils/validation-run-poll.js +29 -5
  192. package/lib/utils/with-muted-logger.js +53 -0
  193. package/package.json +1 -1
  194. package/templates/applications/dataplane/application.yaml +1 -1
  195. package/templates/applications/dataplane/rbac.yaml +10 -10
  196. package/templates/applications/keycloak/env.template +8 -6
  197. package/templates/applications/miso-controller/application.yaml +7 -0
  198. package/templates/applications/miso-controller/env.template +1 -1
  199. package/templates/applications/miso-controller/rbac.yaml +9 -9
  200. package/templates/external-system/README.md.hbs +83 -123
  201. package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +0 -1
  202. package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +0 -1
  203. package/.nyc_output/processinfo/index.json +0 -1
  204. package/lib/api/service-users.api.js +0 -150
  205. package/lib/api/types/service-users.types.js +0 -65
  206. package/lib/cli/setup-service-user.js +0 -187
  207. package/lib/commands/service-user.js +0 -429
@@ -1,4 +1,13 @@
1
- const { formatSuccessLine, formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
1
+ const {
2
+ formatSuccessLine,
3
+ formatSuccessParagraph,
4
+ formatProgress,
5
+ formatWarningLine,
6
+ sectionTitle,
7
+ headerKeyValue,
8
+ metadata,
9
+ formatNextActions
10
+ } = require('../utils/cli-test-layout-chalk');
2
11
  /**
3
12
  * AI Fabrix Builder Build Functions
4
13
  *
@@ -18,7 +27,6 @@ const paths = require('../utils/paths');
18
27
  const { detectAppType, getProjectRoot } = require('../utils/paths');
19
28
  const { resolveApplicationConfigPath } = require('../utils/app-config-resolver');
20
29
  const { loadConfigFile } = require('../utils/config-format');
21
- const chalk = require('chalk');
22
30
  const secrets = require('../core/secrets');
23
31
  const config = require('../core/config');
24
32
  const logger = require('../utils/logger');
@@ -28,6 +36,7 @@ const buildCopy = require('../utils/build-copy');
28
36
  const { buildDevImageName } = require('../utils/image-name');
29
37
  const buildHelpers = require('../utils/build-helpers');
30
38
  const secretsEnvWrite = require('../core/secrets-env-write');
39
+ const { ensureRunSecretsForApp } = require('../app/run-env-compose');
31
40
 
32
41
  /**
33
42
  * Loads application config for an application
@@ -192,7 +201,7 @@ async function postBuildTasks(appName, buildConfig) {
192
201
  // Note: processEnvVariables is already called by generateEnvFile to generate local .env
193
202
  // at the envOutputPath, so we don't need to manually copy the docker .env file
194
203
  } catch (error) {
195
- logger.log(chalk.yellow(`⚠ Warning: Could not generate .env file: ${error.message}`));
204
+ logger.log(formatWarningLine(`Could not generate .env file: ${error.message}`));
196
205
  }
197
206
  }
198
207
 
@@ -205,8 +214,11 @@ async function postBuildTasks(appName, buildConfig) {
205
214
  async function checkExternalAppType(appName) {
206
215
  const variables = await loadVariablesYaml(appName);
207
216
  if (variables.app && variables.app.type === 'external') {
208
- logger.log(chalk.blue(`External system: ${appName}`));
209
- logger.log(chalk.gray('To regenerate deployment JSON, run: aifabrix json ' + appName));
217
+ logger.log('');
218
+ logger.log(sectionTitle('External integration'));
219
+ logger.log(headerKeyValue('Application:', appName));
220
+ logger.log(metadata('No Docker image is built for external systems.'));
221
+ logger.log(formatNextActions([`aifabrix json ${appName}`]));
210
222
  return true;
211
223
  }
212
224
  return false;
@@ -269,9 +281,9 @@ async function prepareDevDirectory(appName, buildConfig, options) {
269
281
  const developerId = await config.getDeveloperId();
270
282
  const idNum = typeof developerId === 'string' ? parseInt(developerId, 10) : developerId;
271
283
  const directoryName = idNum === 0 ? 'applications' : `dev-${developerId}`;
272
- logger.log(chalk.blue(`Copying files to developer-specific directory (${directoryName})...`));
284
+ logger.log(formatProgress(`Copying workspace (${directoryName})…`));
273
285
  const devDir = await buildCopy.copyBuilderToDevDirectory(appName, developerId);
274
- logger.log(formatSuccessLine(`Files copied to: ${devDir}`));
286
+ logger.log(formatSuccessLine(`Workspace ready: ${devDir}`));
275
287
 
276
288
  const { config: appConfig, imageName } = await buildHelpers.loadAndValidateConfig(appName);
277
289
  const effectiveImageName = buildDevImageName(imageName, developerId);
@@ -297,8 +309,11 @@ function prepareBuildContext(buildConfig, devDir) {
297
309
  // Check if context is using old format (../appName) - these are incompatible with dev directory structure
298
310
  if (buildConfig.context && buildConfig.context.startsWith('../') && buildConfig.context !== '../..') {
299
311
  // Old format detected - always use devDir instead
300
- logger.log(chalk.yellow(`⚠ Warning: Build context uses old format: ${buildConfig.context}`));
301
- logger.log(chalk.yellow(` Using dev directory instead: ${devDir}`));
312
+ logger.log(
313
+ formatWarningLine(
314
+ `Build context uses legacy path (${buildConfig.context}). Using dev workspace: ${devDir}`
315
+ )
316
+ );
302
317
  contextPath = devDir;
303
318
  } else if (buildConfig.context && buildConfig.context !== '../..') {
304
319
  // Resolve relative context path from dev directory
@@ -370,6 +385,53 @@ async function handleDockerfileGeneration(appName, params, options, buildHelpers
370
385
  }, generateDockerfile);
371
386
  }
372
387
 
388
+ /**
389
+ * Resolve Docker build-args from resolved env map and merged BASH_* secrets.
390
+ * @param {string} appName
391
+ * @returns {Promise<Object.<string, string>>}
392
+ */
393
+ async function resolveDockerBuildArgsForApp(appName) {
394
+ const envMap = await secretsEnvWrite.resolveAndGetEnvMap(appName, { environment: 'docker' });
395
+ const { getBashPrefixedProcessEnvOverlay } = require('../utils/bash-secret-env');
396
+ const bashOverlay = await getBashPrefixedProcessEnvOverlay(null, appName);
397
+ const buildArgs = {};
398
+ if (envMap.NPM_TOKEN) buildArgs.NPM_TOKEN = envMap.NPM_TOKEN;
399
+ if (envMap.PYPI_TOKEN) buildArgs.PYPI_TOKEN = envMap.PYPI_TOKEN;
400
+ for (const [k, v] of Object.entries(bashOverlay)) {
401
+ if (v && buildArgs[k] === undefined) buildArgs[k] = v;
402
+ }
403
+ return buildArgs;
404
+ }
405
+
406
+ /**
407
+ * Standard Docker build path after CLI header is printed (non-external apps).
408
+ * @param {string} appName
409
+ * @param {Object} options
410
+ * @returns {Promise<string>} Built image ref e.g. name:tag
411
+ */
412
+ async function runStandardDockerBuild(appName, options) {
413
+ const { buildConfig } = await buildHelpers.loadAndValidateConfig(appName);
414
+ const { devDir, effectiveImageName, imageName, appConfig } = await prepareDevDirectory(appName, buildConfig, options);
415
+ const contextPath = prepareBuildContext(buildConfig, devDir);
416
+ const dockerfilePath = await handleDockerfileGeneration(appName, {
417
+ devDir,
418
+ buildConfig,
419
+ contextPath,
420
+ appConfig
421
+ }, options, buildHelpers);
422
+ await ensureRunSecretsForApp(appName);
423
+ const buildArgs = await resolveDockerBuildArgsForApp(appName);
424
+ const buildOptions = { ...options, buildArgs };
425
+ const tag = options.tag || 'latest';
426
+ if (typeof tag === 'string' && tag.includes(',')) {
427
+ throw new Error('Use a single image tag per build (comma-separated multiple tags are not supported).');
428
+ }
429
+ await dockerBuild.executeDockerBuildWithTag(effectiveImageName, imageName, dockerfilePath, contextPath, tag, buildOptions);
430
+ await postBuildTasks(appName, buildConfig);
431
+ logger.log(formatSuccessParagraph('Build completed successfully!'));
432
+ return `${effectiveImageName}:${tag}`;
433
+ }
434
+
373
435
  /**
374
436
  * Builds a container image for the specified application
375
437
  * Auto-detects runtime and generates Dockerfile if needed
@@ -395,42 +457,10 @@ async function buildApp(appName, options = {}) {
395
457
  }
396
458
 
397
459
  try {
398
- logger.log(chalk.blue(`\n🔨 Building application: ${appName}`));
399
-
400
- // 1. Load and validate configuration
401
- const { buildConfig } = await buildHelpers.loadAndValidateConfig(appName);
402
-
403
- // 2. Prepare dev directory and copy files
404
- const { devDir, effectiveImageName, imageName, appConfig } = await prepareDevDirectory(appName, buildConfig, options);
405
-
406
- // 3. Prepare build context
407
- const contextPath = prepareBuildContext(buildConfig, devDir);
408
-
409
- // 4. Handle Dockerfile generation
410
- const dockerfilePath = await handleDockerfileGeneration(appName, {
411
- devDir,
412
- buildConfig,
413
- contextPath,
414
- appConfig
415
- }, options, buildHelpers);
416
-
417
- // 5. Resolve NPM_TOKEN/PYPI_TOKEN for private registries and pass as build-args
418
- const envMap = await secretsEnvWrite.resolveAndGetEnvMap(appName, { environment: 'docker' });
419
- const buildArgs = {};
420
- if (envMap.NPM_TOKEN) buildArgs.NPM_TOKEN = envMap.NPM_TOKEN;
421
- if (envMap.PYPI_TOKEN) buildArgs.PYPI_TOKEN = envMap.PYPI_TOKEN;
422
- const buildOptions = { ...options, buildArgs };
423
-
424
- // 6. Execute Docker build
425
- const tag = options.tag || 'latest';
426
- await dockerBuild.executeDockerBuildWithTag(effectiveImageName, imageName, dockerfilePath, contextPath, tag, buildOptions);
427
-
428
- // 7. Post-build tasks
429
- await postBuildTasks(appName, buildConfig);
430
-
431
- logger.log(formatSuccessParagraph('Build completed successfully!'));
432
- return `${imageName}:${tag}`;
433
-
460
+ logger.log('');
461
+ logger.log(sectionTitle('Build'));
462
+ logger.log(headerKeyValue('Application:', appName));
463
+ return await runStandardDockerBuild(appName, options);
434
464
  } catch (error) {
435
465
  throw new Error(`Build failed: ${error.message}`);
436
466
  }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * @fileoverview `aifabrix doctor` action: environment validation + optional infra health.
3
+ * @author AI Fabrix Team
4
+ * @version 2.0.0
5
+ */
6
+
7
+ const chalk = require('chalk');
8
+ const {
9
+ sectionTitle,
10
+ formatBulletSection,
11
+ formatDatasourceListRow,
12
+ formatWarningLine,
13
+ metadata
14
+ } = require('../utils/cli-test-layout-chalk');
15
+ const validator = require('../validation/validator');
16
+ const config = require('../core/config');
17
+ const infra = require('../infrastructure');
18
+ const logger = require('../utils/logger');
19
+
20
+ /**
21
+ * @param {string} label
22
+ * @param {'ok'|'warning'|'fail'} variant
23
+ * @param {{ ok?: string, warn?: string, fail?: string }} text
24
+ * @returns {string}
25
+ */
26
+ function formatDoctorEnvSummaryLine(label, variant, text) {
27
+ const base = chalk.gray(`${label}:`);
28
+ if (variant === 'ok') return `${base} ${chalk.green('✔')} ${chalk.white(text.ok || '')}`;
29
+ if (variant === 'warning') return `${base} ${chalk.yellow('⚠')} ${chalk.white(text.warn || '')}`;
30
+ return `${base} ${chalk.red('✖')} ${chalk.white(text.fail || '')}`;
31
+ }
32
+
33
+ /**
34
+ * @param {string} statusRaw
35
+ * @returns {'ok'|'warn'|'fail'}
36
+ */
37
+ function doctorInfraRowAggregate(statusRaw) {
38
+ const s = String(statusRaw).trim().toLowerCase();
39
+ if (s === 'healthy') return 'ok';
40
+ if (s === 'unknown') return 'warn';
41
+ return 'fail';
42
+ }
43
+
44
+ /**
45
+ * @param {Object} result - `validator.checkEnvironment()` payload
46
+ */
47
+ function logDoctorEnvironmentSection(result) {
48
+ logger.log('');
49
+ logger.log(sectionTitle('Environment check'));
50
+ logger.log('');
51
+ logger.log(
52
+ formatDoctorEnvSummaryLine(
53
+ 'Docker',
54
+ result.docker === 'ok' ? 'ok' : 'fail',
55
+ { ok: 'Running', fail: 'Not available' }
56
+ )
57
+ );
58
+ logger.log(
59
+ formatDoctorEnvSummaryLine(
60
+ 'Ports',
61
+ result.ports === 'ok' ? 'ok' : 'warning',
62
+ { ok: 'Available', warn: 'Some ports in use' }
63
+ )
64
+ );
65
+ logger.log(
66
+ formatDoctorEnvSummaryLine(
67
+ 'Secrets',
68
+ result.secrets === 'ok' ? 'ok' : 'fail',
69
+ { ok: 'Configured', fail: 'Missing' }
70
+ )
71
+ );
72
+ if (result.recommendations.length > 0) {
73
+ logger.log('');
74
+ logger.log(formatBulletSection('Recommendations:', result.recommendations));
75
+ }
76
+ }
77
+
78
+ /**
79
+ * @param {Object} result - `validator.checkEnvironment()` payload
80
+ */
81
+ async function logDoctorInfraHealthSection(result) {
82
+ if (result.docker !== 'ok') {
83
+ logger.log('');
84
+ logger.log(metadata('Infrastructure health skipped (Docker not available).'));
85
+ return;
86
+ }
87
+ try {
88
+ const cfg = await config.getConfig();
89
+ const health = await infra.checkInfraHealth(null, {
90
+ pgadmin: cfg.pgadmin !== false,
91
+ redisCommander: cfg.redisCommander !== false,
92
+ traefik: !!cfg.traefik
93
+ });
94
+ logger.log('');
95
+ logger.log(sectionTitle('Infrastructure health'));
96
+ Object.entries(health).forEach(([service, status]) => {
97
+ const agg = doctorInfraRowAggregate(status);
98
+ logger.log(formatDatasourceListRow(agg, `${service}: ${status}`, null));
99
+ });
100
+ } catch (_err) {
101
+ logger.log('');
102
+ logger.log(formatWarningLine('Infrastructure is not running or health could not be read.'));
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Runs the doctor checks and prints the TTY summary.
108
+ * @returns {Promise<void>}
109
+ */
110
+ async function runDoctorCheck() {
111
+ const result = await validator.checkEnvironment();
112
+ logDoctorEnvironmentSection(result);
113
+ await logDoctorInfraHealthSection(result);
114
+ logger.log('');
115
+ }
116
+
117
+ module.exports = { runDoctorCheck };
package/lib/cli/index.js CHANGED
@@ -21,8 +21,11 @@ const { setupParametersCommands } = require('./setup-parameters');
21
21
  const { setupExternalSystemCommands } = require('./setup-external-system');
22
22
  const { setupAppCommands: setupAppManagementCommands } = require('../commands/app');
23
23
  const { setupDatasourceCommands } = require('../commands/datasource');
24
+ const { setupDimensionCommands } = require('../commands/dimension');
25
+ const { setupDimensionValueCommands } = require('../commands/dimension-value');
24
26
  const { setupCredentialDeploymentCommands } = require('./setup-credential-deployment');
25
- const { setupServiceUserCommands } = require('./setup-service-user');
27
+ const { setupIntegrationClientCommands } = require('./setup-integration-client');
28
+ const { setupPlatformCommands } = require('./setup-platform');
26
29
 
27
30
  /**
28
31
  * Sets up all CLI commands on the Commander program instance
@@ -35,13 +38,16 @@ function setupCommands(program) {
35
38
  setupEnvironmentCommands(program);
36
39
  setupAppManagementCommands(program);
37
40
  setupDatasourceCommands(program);
41
+ setupDimensionCommands(program);
42
+ setupDimensionValueCommands(program);
38
43
  setupUtilityCommands(program);
39
44
  setupCredentialDeploymentCommands(program);
40
- setupServiceUserCommands(program);
45
+ setupIntegrationClientCommands(program);
41
46
  setupExternalSystemCommands(program);
42
47
  setupDevCommands(program);
43
48
  setupSecretsCommands(program);
44
49
  setupParametersCommands(program);
50
+ setupPlatformCommands(program);
45
51
  }
46
52
 
47
53
  module.exports = {