@aifabrix/builder 2.44.6 → 2.45.5

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 (257) hide show
  1. package/.cursor/rules/cli-layout.mdc +7 -3
  2. package/.cursor/rules/docs-rules.mdc +3 -1
  3. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  4. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  5. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  6. package/jest.projects.js +100 -1
  7. package/lib/api/agent-metadata-validation.api.js +93 -0
  8. package/lib/api/audit-api-helpers.js +68 -0
  9. package/lib/api/audit.api.js +119 -0
  10. package/lib/api/auth-cache.api.js +44 -0
  11. package/lib/api/certificates.api.js +4 -4
  12. package/lib/api/credential.api.js +2 -2
  13. package/lib/api/dataplane-health.api.js +137 -0
  14. package/lib/api/dataplane-sync.api.js +27 -0
  15. package/lib/api/datasources-core.api.js +21 -18
  16. package/lib/api/datasources-extended.api.js +22 -22
  17. package/lib/api/dimensions.api.js +3 -0
  18. package/lib/api/external-systems.api.js +13 -13
  19. package/lib/api/governance-scenarios.api.js +39 -0
  20. package/lib/api/groups.api.js +79 -0
  21. package/lib/api/index.js +45 -2
  22. package/lib/api/pipeline.api.js +4 -4
  23. package/lib/api/protection.api.js +157 -0
  24. package/lib/api/records-bulk.api.js +30 -0
  25. package/lib/api/records-search-parse.js +49 -0
  26. package/lib/api/records-search.api.js +29 -0
  27. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  28. package/lib/api/types/audit.types.js +72 -0
  29. package/lib/api/types/dataplane-health.types.js +27 -0
  30. package/lib/api/types/dimensions.types.js +2 -0
  31. package/lib/api/types/governance-scenarios.types.js +39 -0
  32. package/lib/api/types/protection.types.js +69 -0
  33. package/lib/api/types/records-bulk.types.js +35 -0
  34. package/lib/api/types/records-search.types.js +28 -0
  35. package/lib/api/user-groups.api.js +50 -0
  36. package/lib/api/users.api.js +95 -0
  37. package/lib/api/validation-run.api.js +3 -3
  38. package/lib/api/validation-runner.js +3 -3
  39. package/lib/api/wizard-platform.api.js +3 -3
  40. package/lib/api/wizard.api.js +21 -21
  41. package/lib/app/deploy.js +34 -19
  42. package/lib/app/helpers.js +3 -3
  43. package/lib/app/index.js +3 -3
  44. package/lib/app/register.js +7 -6
  45. package/lib/app/restart-display.js +52 -21
  46. package/lib/app/rotate-secret.js +7 -6
  47. package/lib/app/run-helpers.js +15 -8
  48. package/lib/app/run.js +57 -9
  49. package/lib/app/show-display.js +7 -0
  50. package/lib/app/show.js +87 -5
  51. package/lib/build/index.js +9 -5
  52. package/lib/cli/index.js +4 -2
  53. package/lib/cli/infra-guided.js +62 -28
  54. package/lib/cli/installation-log-command.js +73 -0
  55. package/lib/cli/setup-app.help.js +50 -2
  56. package/lib/cli/setup-app.js +44 -25
  57. package/lib/cli/setup-app.test-commands.js +80 -21
  58. package/lib/cli/setup-auth.js +124 -52
  59. package/lib/cli/setup-external-system.js +37 -3
  60. package/lib/cli/setup-infra-up-dataplane-action.js +111 -0
  61. package/lib/cli/setup-infra-up-platform-action.js +131 -0
  62. package/lib/cli/setup-infra.js +60 -119
  63. package/lib/cli/setup-platform.js +1 -1
  64. package/lib/cli/setup-utility-help-after.js +45 -0
  65. package/lib/cli/setup-utility-resolve.js +132 -0
  66. package/lib/cli/setup-utility.js +148 -116
  67. package/lib/commands/app-logs.js +81 -33
  68. package/lib/commands/auth-config.js +116 -18
  69. package/lib/commands/auth-status-dataplane-version.js +231 -0
  70. package/lib/commands/auth-status-display.js +94 -0
  71. package/lib/commands/auth-status.js +70 -6
  72. package/lib/commands/credential-push.js +10 -5
  73. package/lib/commands/datasource-load-export-cli.js +178 -0
  74. package/lib/commands/datasource-test-trust-cli.js +114 -0
  75. package/lib/commands/datasource-unified-test-cli.js +25 -17
  76. package/lib/commands/datasource-unified-test-cli.options.js +18 -3
  77. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  78. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  79. package/lib/commands/datasource.js +68 -1
  80. package/lib/commands/dimension-value.js +43 -13
  81. package/lib/commands/dimension.js +38 -7
  82. package/lib/commands/identity-apply-sync.js +131 -0
  83. package/lib/commands/identity-group-cli.js +146 -0
  84. package/lib/commands/identity-membership-role-cache.js +175 -0
  85. package/lib/commands/identity-shared.js +94 -0
  86. package/lib/commands/identity-user-cli.js +158 -0
  87. package/lib/commands/identity.js +43 -0
  88. package/lib/commands/login.js +46 -16
  89. package/lib/commands/protection-cli-leaves.js +286 -0
  90. package/lib/commands/protection.js +50 -0
  91. package/lib/commands/repair.js +13 -3
  92. package/lib/commands/setup-modes.js +19 -6
  93. package/lib/commands/setup-prompts.js +41 -8
  94. package/lib/commands/setup.js +114 -9
  95. package/lib/commands/teardown.js +54 -5
  96. package/lib/commands/test-e2e-external.js +40 -9
  97. package/lib/commands/test-governance-cli-options.js +47 -0
  98. package/lib/commands/test-governance-command-action.js +55 -0
  99. package/lib/commands/test-governance-external.js +88 -0
  100. package/lib/commands/test-trust-cli-options.js +32 -0
  101. package/lib/commands/test-trust-command-action.js +118 -0
  102. package/lib/commands/test-trust-external.js +127 -0
  103. package/lib/commands/up-common.js +48 -14
  104. package/lib/commands/up-dataplane.js +21 -18
  105. package/lib/commands/up-miso.js +12 -8
  106. package/lib/commands/upload.js +38 -15
  107. package/lib/commands/wizard-core.js +3 -0
  108. package/lib/core/audit-logger.js +1 -34
  109. package/lib/core/config-admin-email.js +56 -0
  110. package/lib/core/config-device-dataplane.js +185 -0
  111. package/lib/core/config-normalize.js +60 -0
  112. package/lib/core/config-registered-controller-urls.js +54 -0
  113. package/lib/core/config.js +33 -50
  114. package/lib/core/secrets-ensure-infra.js +1 -1
  115. package/lib/core/secrets-env-content.js +86 -90
  116. package/lib/core/secrets-env-declarative-expand.js +170 -0
  117. package/lib/core/secrets-env-write.js +2 -0
  118. package/lib/core/secrets-load.js +106 -102
  119. package/lib/datasource/agent-trust-debug-log.js +45 -0
  120. package/lib/datasource/agent-trust-fetch.js +115 -0
  121. package/lib/datasource/agent-trust-map.js +101 -0
  122. package/lib/datasource/agent-trust-mock.js +44 -0
  123. package/lib/datasource/agent-trust-run.js +93 -0
  124. package/lib/datasource/agent-trust-timeout.js +25 -0
  125. package/lib/datasource/audit-evidence-display.js +80 -0
  126. package/lib/datasource/audit-evidence-extract-debug.js +103 -0
  127. package/lib/datasource/audit-evidence-extract.js +177 -0
  128. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  129. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  130. package/lib/datasource/audit-evidence-poll.js +109 -0
  131. package/lib/datasource/audit-evidence-run.js +177 -0
  132. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  133. package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
  134. package/lib/datasource/audit-evidence-verify.js +108 -0
  135. package/lib/datasource/bulk-loader-run-batches.js +88 -0
  136. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  137. package/lib/datasource/bulk-loader-service.js +127 -0
  138. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  139. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  140. package/lib/datasource/datasource-exporter-service.js +144 -0
  141. package/lib/datasource/datasource-identifier.js +148 -0
  142. package/lib/datasource/datasource-load-export-context.js +92 -0
  143. package/lib/datasource/integration-context.js +6 -4
  144. package/lib/datasource/local-data-paths.js +145 -0
  145. package/lib/datasource/log-cleaner.js +241 -0
  146. package/lib/datasource/log-viewer.js +111 -6
  147. package/lib/datasource/record-file-parser.js +85 -0
  148. package/lib/datasource/record-mapper.js +129 -0
  149. package/lib/datasource/resolve-app.js +74 -55
  150. package/lib/datasource/test-e2e.js +26 -2
  151. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  152. package/lib/datasource/unified-validation-run.js +43 -17
  153. package/lib/datasource/validate.js +37 -20
  154. package/lib/external-system/deploy.js +5 -1
  155. package/lib/external-system/test-system-level.js +25 -4
  156. package/lib/external-system/test.js +3 -1
  157. package/lib/governance/governance-pack-loader.js +70 -0
  158. package/lib/governance/governance-run-display.js +119 -0
  159. package/lib/identity/identity-apply-core.js +108 -0
  160. package/lib/identity/identity-apply-phases.js +244 -0
  161. package/lib/identity/identity-apply-service.js +77 -0
  162. package/lib/identity/identity-csv-parser.js +114 -0
  163. package/lib/internal/fs-real-sync.js +29 -1
  164. package/lib/internal/node-fs.js +2 -0
  165. package/lib/protection/auth-context.js +45 -0
  166. package/lib/protection/convert-batch.js +90 -0
  167. package/lib/protection/load.js +41 -0
  168. package/lib/protection/paths.js +158 -0
  169. package/lib/protection/preflight-datasource-ready.js +46 -0
  170. package/lib/protection/protection-create-probe-lines.js +142 -0
  171. package/lib/protection/protection-create-probes.js +95 -0
  172. package/lib/protection/protection-create-scaffold.js +281 -0
  173. package/lib/protection/protection-display-helpers.js +445 -0
  174. package/lib/protection/protection-display.js +215 -0
  175. package/lib/protection/protection-preset-registry.js +97 -0
  176. package/lib/protection/report-exit.js +62 -0
  177. package/lib/protection/resolve.js +202 -0
  178. package/lib/protection/run-commands-validate.js +130 -0
  179. package/lib/protection/run-commands.js +216 -0
  180. package/lib/protection/run-protection-create-helpers.js +134 -0
  181. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  182. package/lib/protection/run-protection-create.js +191 -0
  183. package/lib/protection/scope.js +22 -0
  184. package/lib/protection/sync-after-upload.js +64 -0
  185. package/lib/protection/upload-batch.js +127 -0
  186. package/lib/protection/validate-batch.js +113 -0
  187. package/lib/protection/validate-local.js +65 -0
  188. package/lib/resolvers/dimension-file.js +29 -4
  189. package/lib/schema/application-schema.json +4 -0
  190. package/lib/schema/external-datasource.schema.json +47 -13
  191. package/lib/schema/flag-map-validation-run.json +2 -2
  192. package/lib/schema/infra.parameter.yaml +10 -0
  193. package/lib/schema/protection.schema.json +374 -0
  194. package/lib/schema/type/credential-field-registry.json +636 -0
  195. package/lib/schema/wizard-config.schema.json +1 -1
  196. package/lib/utils/agent-trust-run-display.js +231 -0
  197. package/lib/utils/agent-trust-run-exit.js +59 -0
  198. package/lib/utils/agent-trust-wait-ui.js +94 -0
  199. package/lib/utils/app-config-resolver.js +24 -1
  200. package/lib/utils/applications-config-defaults.js +206 -0
  201. package/lib/utils/auth-config-validator.js +2 -12
  202. package/lib/utils/bash-secret-env.js +1 -1
  203. package/lib/utils/cli-exit-codes.js +30 -0
  204. package/lib/utils/cli-sync-options.js +33 -0
  205. package/lib/utils/compose-generate-docker-compose.js +111 -6
  206. package/lib/utils/compose-generator.js +17 -8
  207. package/lib/utils/controller-url.js +50 -7
  208. package/lib/utils/credential-push-ui.js +90 -0
  209. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  210. package/lib/utils/dataplane-cli-version-help.js +74 -0
  211. package/lib/utils/datasource-export-display.js +137 -0
  212. package/lib/utils/datasource-load-display.js +174 -0
  213. package/lib/utils/datasource-load-export-ui.js +120 -0
  214. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  215. package/lib/utils/datasource-test-run-display.js +3 -3
  216. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  217. package/lib/utils/env-copy.js +99 -14
  218. package/lib/utils/env-template.js +5 -1
  219. package/lib/utils/health-check-url.js +18 -15
  220. package/lib/utils/health-check.js +7 -5
  221. package/lib/utils/help-builder.js +30 -24
  222. package/lib/utils/infra-optional-service-flags.js +69 -0
  223. package/lib/utils/installation-log-core.js +282 -0
  224. package/lib/utils/installation-log-record.js +237 -0
  225. package/lib/utils/installation-log.js +123 -0
  226. package/lib/utils/log-redaction.js +105 -0
  227. package/lib/utils/manifest-location.js +164 -0
  228. package/lib/utils/manifest-source-emit.js +184 -0
  229. package/lib/utils/paths.js +238 -89
  230. package/lib/utils/remote-secrets-loader.js +7 -1
  231. package/lib/utils/run-cli-flags.js +29 -0
  232. package/lib/utils/secrets-canonical.js +10 -3
  233. package/lib/utils/secrets-path.js +3 -4
  234. package/lib/utils/secrets-utils.js +20 -10
  235. package/lib/utils/semver-compare.js +127 -0
  236. package/lib/utils/system-builder-root.js +10 -2
  237. package/lib/utils/upload-pipeline-ui.js +91 -0
  238. package/lib/utils/url-declarative-public-base.js +80 -12
  239. package/lib/utils/url-declarative-resolve-build-urls.js +238 -0
  240. package/lib/utils/url-declarative-resolve-build.js +24 -393
  241. package/lib/utils/url-declarative-resolve-expand-token.js +189 -0
  242. package/lib/utils/url-declarative-resolve-load-doc.js +12 -3
  243. package/lib/utils/url-declarative-resolve-surface-state.js +102 -0
  244. package/lib/utils/url-declarative-resolve.js +47 -7
  245. package/lib/utils/url-declarative-runtime-base-path.js +21 -1
  246. package/lib/utils/urls-local-registry-scan.js +103 -0
  247. package/lib/utils/urls-local-registry.js +161 -90
  248. package/lib/utils/validation-poll-ui.js +14 -7
  249. package/lib/validation/wizard-config-validator.js +58 -19
  250. package/package.json +3 -1
  251. package/templates/applications/dataplane/application.yaml +4 -0
  252. package/templates/applications/dataplane/env.template +13 -1
  253. package/templates/applications/dataplane/rbac.yaml +4 -0
  254. package/templates/applications/miso-controller/application.yaml +2 -0
  255. package/templates/applications/miso-controller/env.template +27 -29
  256. package/templates/external-system/README.md.hbs +56 -8
  257. package/.npmrc.token +0 -1
@@ -12,22 +12,14 @@ const {
12
12
  * @version 2.0.0
13
13
  */
14
14
 
15
- const chalk = require('chalk');
16
15
  const infra = require('../infrastructure');
17
16
  const appLib = require('../app');
18
17
  const config = require('../core/config');
19
18
  const logger = require('../utils/logger');
20
- const { handleCommandError, isAuthenticationError } = require('../utils/cli-utils');
21
- const { resolveControllerUrl } = require('../utils/controller-url');
22
- const { handleLogin } = require('../commands/login');
19
+ const { handleCommandError } = require('../utils/cli-utils');
23
20
  const { handleUpMiso } = require('../commands/up-miso');
24
- const { handleUpDataplane } = require('../commands/up-dataplane');
25
- const {
26
- applyUpPlatformForceConfig,
27
- cleanBuilderAppDirs,
28
- prepareUrlsLocalRegistryForUpPlatform
29
- } = require('../commands/up-common');
30
- const { runGuidedUpInfra, runGuidedUpMiso, runGuidedUpDataplane, runGuidedUpPlatform, runGuidedDownInfra } = require('./infra-guided');
21
+ const { cleanBuilderAppDirs } = require('../commands/up-common');
22
+ const { runGuidedUpInfra, runGuidedUpMiso, runGuidedDownInfra } = require('./infra-guided');
31
23
  const {
32
24
  loadInfraStatusSummary,
33
25
  formatInfraStatusTitleLine,
@@ -40,6 +32,11 @@ const {
40
32
  buildRestartInfraHelpLines
41
33
  } = require('../constants/infra-compose-service-names');
42
34
 
35
+ const {
36
+ computeEffectiveInfraOptionalFlags,
37
+ persistMissingInfraOptionalServiceFlags
38
+ } = require('../utils/infra-optional-service-flags');
39
+
43
40
  const UP_INFRA_HELP_AFTER = `
44
41
  Typical sequence:
45
42
  $ aifabrix up-infra
@@ -83,19 +80,6 @@ async function persistTlsEnabledFlag(cfg, value) {
83
80
  ));
84
81
  }
85
82
 
86
- /**
87
- * Resolves effective boolean from option vs config.
88
- * @param {*} optValue - options.traefik | options.pgAdmin | options.redisAdmin
89
- * @param {*} cfgValue - cfg.traefik | cfg.pgadmin | cfg.redisCommander
90
- * @param {boolean} defaultWhenUndef - Default when config value is undefined
91
- * @returns {boolean}
92
- */
93
- function resolveFlag(optValue, cfgValue, defaultWhenUndef = true) {
94
- if (optValue === true) return true;
95
- if (optValue === false) return false;
96
- return cfgValue !== false && (cfgValue === true || defaultWhenUndef);
97
- }
98
-
99
83
  /**
100
84
  * @param {Object} options - Commander options
101
85
  * @returns {Promise<number|null>} Developer ID or null
@@ -152,31 +136,18 @@ async function runUpInfraCommand(options) {
152
136
  await maybePersistTlsFromUpInfra(options, cfg);
153
137
  const adminPass = options.adminPassword || options.adminPwd;
154
138
  const tlsEnabledEffective = cfg.tlsEnabled === true;
139
+ const effective = computeEffectiveInfraOptionalFlags(cfg, options);
155
140
  await infra.startInfra(developerId, {
156
- traefik: resolveFlag(options.traefik, cfg.traefik, false),
157
- pgadmin: resolveFlag(options.pgAdmin, cfg.pgadmin, true),
158
- redisCommander: resolveFlag(options.redisAdmin, cfg.redisCommander, true),
141
+ traefik: effective.traefik,
142
+ pgadmin: effective.pgadmin,
143
+ redisCommander: effective.redisCommander,
159
144
  adminPassword: adminPass,
160
145
  adminPwd: adminPass,
161
146
  adminEmail: options.adminEmail,
162
147
  userPassword: options.userPassword,
163
148
  tlsEnabled: tlsEnabledEffective
164
149
  });
165
- }
166
-
167
- async function maybeHandleUpPlatformAuthRetry(error, options) {
168
- if (!isAuthenticationError(error)) {
169
- return false;
170
- }
171
- const controllerUrl = error.controllerUrl || await resolveControllerUrl();
172
- if (!options.verbose) {
173
- logger.log(formatProgress('Authenticating...'));
174
- } else {
175
- logger.log(chalk.blue('\nAuthentication required. Running aifabrix login...\n'));
176
- }
177
- await handleLogin({ method: 'device', controller: controllerUrl, compact: !options.verbose });
178
- await handleUpDataplane(options);
179
- return true;
150
+ await persistMissingInfraOptionalServiceFlags(cfg, effective);
180
151
  }
181
152
 
182
153
  function setupUpInfraCommand(program) {
@@ -197,14 +168,28 @@ function setupUpInfraCommand(program) {
197
168
  .option('--tls', 'Enable TLS mode; save tlsEnabled (${TLS_ENABLED}=true, ${HTTP_ENABLED}=false in application.yaml)')
198
169
  .option('--no-tls', 'Disable TLS mode (${TLS_ENABLED}=false, ${HTTP_ENABLED}=true)')
199
170
  .action(async(options) => {
171
+ const startedAt = new Date();
172
+ const { recordInfraInstallationCommand } = require('./installation-log-command');
200
173
  try {
201
174
  if (!options.verbose) {
202
175
  await runGuidedUpInfra(options, runUpInfraCommand);
203
- return;
176
+ } else {
177
+ await runUpInfraCommand(options);
204
178
  }
205
-
206
- await runUpInfraCommand(options);
179
+ await recordInfraInstallationCommand({
180
+ command: 'up-infra',
181
+ options,
182
+ startedAt,
183
+ outcome: 'success'
184
+ });
207
185
  } catch (error) {
186
+ await recordInfraInstallationCommand({
187
+ command: 'up-infra',
188
+ options,
189
+ startedAt,
190
+ outcome: 'failure',
191
+ error
192
+ });
208
193
  handleCommandError(error, 'up-infra');
209
194
  process.exit(1);
210
195
  }
@@ -223,45 +208,9 @@ function setupUpPlatformCommand(program) {
223
208
  '-f, --force',
224
209
  'Reset CLI auth (clear all device/client tokens, set environment to dev, set default controller URL from developer-id), clean builder/keycloak, builder/miso-controller, builder/dataplane, then re-fetch from templates'
225
210
  )
226
- .action(async(options) => {
227
- try {
228
- let platformForceCleanSummary = null;
229
- if (options.force) {
230
- const forceSummary = await applyUpPlatformForceConfig({ silent: !options.verbose });
231
- const cleanedApps = await cleanBuilderAppDirs(['keycloak', 'miso-controller', 'dataplane'], {
232
- silent: !options.verbose
233
- });
234
- if (!options.verbose) {
235
- platformForceCleanSummary = { forceSummary, cleanedApps };
236
- }
237
- }
238
-
239
- if (!options.verbose) {
240
- await runGuidedUpPlatform(
241
- options,
242
- handleUpMiso,
243
- handleUpDataplane,
244
- handleLogin,
245
- platformForceCleanSummary
246
- );
247
- return;
248
- }
249
-
250
- await prepareUrlsLocalRegistryForUpPlatform();
251
- await handleUpMiso(options);
252
- await handleUpDataplane(options);
253
- } catch (error) {
254
- try {
255
- if (await maybeHandleUpPlatformAuthRetry(error, options)) {
256
- return;
257
- }
258
- } catch (loginOrRetryError) {
259
- handleCommandError(loginOrRetryError, 'up-platform');
260
- process.exit(1);
261
- }
262
- handleCommandError(error, 'up-platform');
263
- process.exit(1);
264
- }
211
+ .action((options) => {
212
+ const { handleUpPlatformCliAction } = require('./setup-infra-up-platform-action');
213
+ return handleUpPlatformCliAction(options);
265
214
  });
266
215
  }
267
216
 
@@ -275,17 +224,37 @@ function setupUpMisoCommand(program) {
275
224
  .option('-f, --force', 'Clean builder/keycloak and builder/miso-controller and re-fetch from templates')
276
225
  .option('--verbose', 'Show full orchestration output (default is guided summary)')
277
226
  .action(async(options) => {
227
+ const startedAt = new Date();
228
+ const { recordInfraInstallationCommand } = require('./installation-log-command');
229
+ let cleanedAppKeys = [];
278
230
  try {
279
231
  if (options.force) {
280
- await cleanBuilderAppDirs(['keycloak', 'miso-controller']);
232
+ const c = await cleanBuilderAppDirs(['keycloak', 'miso-controller']);
233
+ cleanedAppKeys = Array.isArray(c) ? c : [];
281
234
  }
282
235
  if (!options.verbose) {
283
236
  await runGuidedUpMiso(options, handleUpMiso);
284
- return;
237
+ } else {
238
+ await handleUpMiso(options);
285
239
  }
286
-
287
- await handleUpMiso(options);
240
+ await recordInfraInstallationCommand({
241
+ command: 'up-miso',
242
+ options,
243
+ startedAt,
244
+ outcome: 'success',
245
+ platformAppList: ['keycloak', 'miso-controller'],
246
+ cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined
247
+ });
288
248
  } catch (error) {
249
+ await recordInfraInstallationCommand({
250
+ command: 'up-miso',
251
+ options,
252
+ startedAt,
253
+ outcome: 'failure',
254
+ error,
255
+ platformAppList: ['keycloak', 'miso-controller'],
256
+ cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined
257
+ });
289
258
  handleCommandError(error, 'up-miso');
290
259
  process.exit(1);
291
260
  }
@@ -301,37 +270,9 @@ function setupUpDataplaneCommand(program) {
301
270
  .option('--base', 'Resolve dataplane image from manifest only when running locally (default: true)', true)
302
271
  .option('-f, --force', 'Clean builder/dataplane and re-fetch from templates')
303
272
  .option('--verbose', 'Show full orchestration output (default is guided summary)')
304
- .action(async(options) => {
305
- try {
306
- if (options.force) {
307
- await cleanBuilderAppDirs(['dataplane']);
308
- }
309
- if (!options.verbose) {
310
- await runGuidedUpDataplane(options, handleUpDataplane);
311
- return;
312
- }
313
-
314
- await handleUpDataplane(options);
315
- } catch (error) {
316
- if (isAuthenticationError(error)) {
317
- const controllerUrl = error.controllerUrl || await resolveControllerUrl();
318
- if (!options.verbose) {
319
- logger.log(formatProgress('Authenticating...'));
320
- } else {
321
- logger.log(chalk.blue('\nAuthentication required. Running aifabrix login...\n'));
322
- }
323
- try {
324
- await handleLogin({ method: 'device', controller: controllerUrl, compact: !options.verbose });
325
- await handleUpDataplane(options);
326
- return;
327
- } catch (loginOrRetryError) {
328
- handleCommandError(loginOrRetryError, 'up-dataplane');
329
- process.exit(1);
330
- }
331
- }
332
- handleCommandError(error, 'up-dataplane');
333
- process.exit(1);
334
- }
273
+ .action((options) => {
274
+ const { handleUpDataplaneCliAction } = require('./setup-infra-up-dataplane-action');
275
+ return handleUpDataplaneCliAction(options);
335
276
  });
336
277
  }
337
278
 
@@ -23,7 +23,7 @@ const { handleTeardown } = require('../commands/teardown');
23
23
 
24
24
  const SETUP_HELP_AFTER = `
25
25
  What this command does:
26
- - With no infra running: prompts for admin email/password (used for Postgres, pgAdmin, Keycloak), prompts for an AI tool (OpenAI or Azure OpenAI) only when keys are not already set, then runs up-infra and up-platform.
26
+ - With no infra running: prompts for admin email/password (used for Postgres, pgAdmin, Keycloak). The email is saved as adminEmail in config.yaml so the next setup can show it as the default (you can still change it). Prompts for an AI tool (OpenAI or Azure OpenAI) only when keys are not already set, then runs up-infra and up-platform.
27
27
  - With infra running: shows a mode menu:
28
28
  1) Re-install — stop infra and remove all volumes, then up-infra + up-platform --force.
29
29
  2) Wipe data — drop every database and DB user, then up-infra + up-platform --force.
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @fileoverview Help-after strings for setup-utility CLI commands.
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const JSON_HELP_AFTER = `
8
+ Example:
9
+ $ aifabrix json myapp
10
+ Generates *-deploy.json (or application-schema.json) for commit before deploy.
11
+ `;
12
+
13
+ const VALIDATE_HELP_AFTER = `
14
+ Examples:
15
+ $ aifabrix validate myapp
16
+ $ aifabrix validate myapp --cert-sync
17
+ $ aifabrix validate --integration
18
+ $ aifabrix validate --builder
19
+ `;
20
+
21
+ const REPAIR_HELP_AFTER = `
22
+ Examples:
23
+ $ aifabrix repair hubspot-demo
24
+ Align manifest, system/datasource files, RBAC extract, env.template, and deploy JSON under integration/<systemKey>/.
25
+
26
+ $ aifabrix repair hubspot-demo --dry-run
27
+ Show what would change without writing files.
28
+
29
+ $ aifabrix repair hubspot-demo --auth oauth2
30
+ Set authentication method; updates the system file and env.template (oauth2, aad, apikey, basic, …).
31
+
32
+ $ aifabrix repair hubspot-demo --rbac --expose --sync --test
33
+ Optional datasource fixes: RBAC roles/permissions, exposed.schema from attributes, default sync block, testPayload stubs.
34
+
35
+ $ aifabrix repair hubspot-demo --doc
36
+ Regenerate README.md from the current deployment manifest only (other drift fixes unchanged).
37
+
38
+ Before overwriting files, repair writes timestamped backups under integration/<systemKey>/backup/ (same as datasource capability copy). Use --no-backup to skip.
39
+ `;
40
+
41
+ module.exports = {
42
+ JSON_HELP_AFTER,
43
+ VALIDATE_HELP_AFTER,
44
+ REPAIR_HELP_AFTER
45
+ };
@@ -0,0 +1,132 @@
1
+ /**
2
+ * `aifabrix resolve <app>` command wiring (split from setup-utility for file/function size limits).
3
+ *
4
+ * @fileoverview Resolve CLI command
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const secrets = require('../core/secrets');
13
+ const logger = require('../utils/logger');
14
+ const { handleCommandError } = require('../utils/cli-utils');
15
+ const coreConfig = require('../core/config');
16
+ const { resolvePreferLocalEnvOutputPathFlag } = require('../utils/applications-config-defaults');
17
+ const { getResolveAppPath } = require('../utils/paths');
18
+
19
+ /**
20
+ * @param {string} appName
21
+ * @param {string} appPath
22
+ * @param {boolean} envOnly
23
+ * @param {string} envPath
24
+ * @param {{ skipValidation?: boolean }} options
25
+ * @param {{ getManifestSourcePayload: function }} manifestEmit
26
+ * @returns {Promise<void>}
27
+ */
28
+ async function runResolveJsonOutput(appName, appPath, envOnly, envPath, options, manifestEmit) {
29
+ /** @type {Record<string, unknown>} */
30
+ const payload = {
31
+ app: appName,
32
+ appPath,
33
+ envOnly,
34
+ envPath,
35
+ manifestSource: envOnly ? null : manifestEmit.getManifestSourcePayload(appName, appPath)
36
+ };
37
+ if (!envOnly && !options.skipValidation) {
38
+ const validate = require('../validation/validate');
39
+ payload.validation = await validate.validateAppOrFile(appName);
40
+ }
41
+ logger.log(JSON.stringify(payload, null, 2));
42
+ const v = payload.validation;
43
+ if (v && typeof v === 'object' && v.valid === false) {
44
+ process.exit(1);
45
+ }
46
+ }
47
+
48
+ /**
49
+ * @param {string} appName
50
+ * @param {string} envPath
51
+ * @param {boolean} envOnly
52
+ * @param {{ skipValidation?: boolean }} options
53
+ * @returns {Promise<void>}
54
+ */
55
+ async function runResolveHumanOutput(appName, envPath, envOnly, options) {
56
+ logger.log(`✔ Generated .env file: ${envPath}`);
57
+ logger.log(chalk.gray(' Note: up-platform / up-miso / up-dataplane / register / build resolve secrets in memory only.'));
58
+ logger.log(chalk.gray(` Re-run "aifabrix resolve ${appName}" whenever you need an on-disk .env again.`));
59
+ if (envOnly) {
60
+ logger.log(chalk.gray(' (env-only mode: validation skipped; no application config file)'));
61
+ return;
62
+ }
63
+ if (options.skipValidation) {
64
+ return;
65
+ }
66
+ const validate = require('../validation/validate');
67
+ const result = await validate.validateAppOrFile(appName);
68
+ validate.displayValidationResults(result);
69
+ if (!result.valid) {
70
+ logger.log(chalk.yellow('\n⚠ Validation found errors. Fix them before deploying.'));
71
+ process.exit(1);
72
+ }
73
+ }
74
+
75
+ /**
76
+ * @param {string} appName
77
+ * @param {{ force?: boolean, skipValidation?: boolean, json?: boolean }} options
78
+ * @returns {Promise<void>}
79
+ */
80
+ async function runResolveAppAction(appName, options) {
81
+ const jsonMode = options.json === true;
82
+ const { appPath, envOnly } = await getResolveAppPath(appName);
83
+ const manifestEmit = require('../utils/manifest-source-emit');
84
+ manifestEmit.emitManifestMetadataLineIfTTY(logger, {
85
+ appKey: appName,
86
+ appPath,
87
+ envOnly,
88
+ json: jsonMode
89
+ });
90
+ const userCfg = await coreConfig.getConfig();
91
+ const preferLocalEnvOutputPath = await resolvePreferLocalEnvOutputPathFlag(userCfg, appName);
92
+ const envPath = await secrets.generateEnvFile(
93
+ appName,
94
+ undefined,
95
+ 'docker',
96
+ options.force,
97
+ {
98
+ appPath,
99
+ envOnly,
100
+ skipOutputPath: false,
101
+ preserveFromPath: null,
102
+ preferLocalEnvOutputPath
103
+ }
104
+ );
105
+ if (jsonMode) {
106
+ await runResolveJsonOutput(appName, appPath, envOnly, envPath, options, manifestEmit);
107
+ return;
108
+ }
109
+ await runResolveHumanOutput(appName, envPath, envOnly, options);
110
+ }
111
+
112
+ /**
113
+ * @param {import('commander').Command} program
114
+ * @returns {void}
115
+ */
116
+ function setupResolveCommand(program) {
117
+ program.command('resolve <appKey|systemKey>')
118
+ .description('Generate .env from template (builder/<appKey>/ or integration/<systemKey>/); optional validate after')
119
+ .option('-f, --force', 'Generate missing secret keys in secrets file')
120
+ .option('--skip-validation', 'Skip file validation after generating .env')
121
+ .option('--json', 'Print JSON summary (envPath, manifestSource, optional validation)')
122
+ .action(async(appName, options) => {
123
+ try {
124
+ await runResolveAppAction(appName, options);
125
+ } catch (error) {
126
+ handleCommandError(error, 'resolve');
127
+ process.exit(1);
128
+ }
129
+ });
130
+ }
131
+
132
+ module.exports = { setupResolveCommand };