@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
@@ -23,12 +23,123 @@ Examples:
23
23
  const AUTH_HELP_AFTER = `
24
24
  Without options: show auth status (same as: aifabrix auth status).
25
25
  With --set-controller or --set-environment: write defaults to config.yaml.
26
+ Omit the URL on --set-controller to pick from controllers already stored in config (device logins + default).
27
+ For details on omitting the URL: aifabrix auth set-controller -h
26
28
  Aliases:
27
- aifabrix auth set-controller <url>
29
+ aifabrix auth set-controller [url]
28
30
  aifabrix auth set-environment <env>
29
- Subcommand: auth status [--validate] for CI/scripts.
31
+ Subcommand: auth status [--validate] for CI/scripts (exit codes 0/1/3).
30
32
  `;
31
33
 
34
+ const AUTH_STATUS_HELP_AFTER = `
35
+ Examples:
36
+ $ aifabrix auth status
37
+ $ aifabrix auth status --validate
38
+
39
+ Exit codes (--validate only):
40
+ 0 Authenticated and Builder CLI meets dataplane minimum (or no minimum configured)
41
+ 1 Not authenticated — run aifabrix login
42
+ 3 Authenticated but Builder CLI is older than dataplane minimum
43
+
44
+ Config cache (written on status when dataplane is reachable):
45
+ ~/.aifabrix/config.yaml → device.<controllerUrl>:
46
+ dataplane-version — last dataplane version from health
47
+ dataplane-min-cli-version — minimum Builder CLI required (when enforced)
48
+
49
+ What is blocked when CLI is too old:
50
+ Dataplane commands (upload, wizard, datasource upload, deploy to dataplane, …)
51
+ What still works:
52
+ Local validate, aifabrix run, up-infra, file generation without dataplane API calls
53
+
54
+ Troubleshooting:
55
+ • "Upgrade required" but you upgraded — run auth status again to refresh cache
56
+ • No min version shown — dataplane MIN_BUILDER_CLI_VERSION not set (ops)
57
+ • CI exit 3 — pin @aifabrix/builder version in pipeline to ≥ dataplane-min-cli-version
58
+ `;
59
+
60
+ const AUTH_SET_CONTROLLER_HELP_AFTER = `
61
+ Argument:
62
+ [url] Optional. When omitted, the CLI uses controllers already known in your config file
63
+ (the default controller value plus each device-token key). Requires an interactive TTY.
64
+
65
+ Behavior:
66
+ - No saved controllers: error; run aifabrix login first, or pass a URL.
67
+ - One saved controller: if it is already the default, prints confirmation; otherwise sets it.
68
+ - Several saved controllers: interactive list to choose the default.
69
+ - Non-interactive shell: pass the URL explicitly (piped/CI shells cannot pick without a URL).
70
+
71
+ Examples:
72
+ $ aifabrix auth set-controller
73
+ Pick default controller from config (TTY), or set the only saved one.
74
+
75
+ $ aifabrix auth set-controller http://localhost:3600
76
+ Set default controller to that URL (validated; same rules as aifabrix auth --set-controller).
77
+
78
+ $ aifabrix auth --set-controller
79
+ Same as omitting the URL on this subcommand (parent command flag).
80
+ `;
81
+
82
+ function createAuthStatusAction() {
83
+ return async(options) => {
84
+ try {
85
+ await handleAuthStatus(options);
86
+ } catch (error) {
87
+ handleCommandError(error, 'auth status');
88
+ process.exit(1);
89
+ }
90
+ };
91
+ }
92
+
93
+ function createAuthParentAction() {
94
+ return async(options) => {
95
+ try {
96
+ const setController = options.setController || options['set-controller'];
97
+ const setEnvironment = options.setEnvironment || options['set-environment'];
98
+ if (setController || setEnvironment) {
99
+ await handleAuthConfig({
100
+ setController,
101
+ setEnvironment
102
+ });
103
+ return;
104
+ }
105
+ await handleAuthStatus(options);
106
+ } catch (error) {
107
+ handleCommandError(error, 'auth');
108
+ process.exit(1);
109
+ }
110
+ };
111
+ }
112
+
113
+ function registerAuthSetControllerSubcommand(auth) {
114
+ const setControllerCmd = auth.command('set-controller [url]').description(
115
+ 'Set config.controller to a URL, or omit the URL to pick from controllers already stored in config'
116
+ );
117
+ if (typeof setControllerCmd.summary === 'function') {
118
+ setControllerCmd.summary('Set or pick default controller URL in config');
119
+ }
120
+ setControllerCmd.addHelpText('after', AUTH_SET_CONTROLLER_HELP_AFTER).action(async(url) => {
121
+ try {
122
+ await handleAuthConfig({ setController: url || true });
123
+ } catch (error) {
124
+ handleCommandError(error, 'auth set-controller');
125
+ process.exit(1);
126
+ }
127
+ });
128
+ }
129
+
130
+ function registerAuthSetEnvironmentSubcommand(auth) {
131
+ auth.command('set-environment <env>')
132
+ .description('Set default environment in config (alias for auth --set-environment)')
133
+ .action(async(env) => {
134
+ try {
135
+ await handleAuthConfig({ setEnvironment: env });
136
+ } catch (error) {
137
+ handleCommandError(error, 'auth set-environment');
138
+ process.exit(1);
139
+ }
140
+ });
141
+ }
142
+
32
143
  function setupLoginCommand(program) {
33
144
  program.command('login')
34
145
  .description('Sign in to Miso Controller (device or credentials flow)')
@@ -68,63 +179,24 @@ function setupLogoutCommand(program) {
68
179
  }
69
180
 
70
181
  function setupAuthSubcommands(program) {
71
- const authStatusHandler = async(options) => {
72
- try {
73
- await handleAuthStatus(options);
74
- } catch (error) {
75
- handleCommandError(error, 'auth status');
76
- process.exit(1);
77
- }
78
- };
79
182
  const auth = program.command('auth')
80
183
  .description('Show auth status or set default controller/environment')
81
184
  .addHelpText('after', AUTH_HELP_AFTER)
82
- .option('--set-controller <url>', 'Set default controller URL in config')
185
+ .option(
186
+ '--set-controller [url]',
187
+ 'Set default controller URL in config; omit url to choose from controllers registered in config'
188
+ )
83
189
  .option('--set-environment <env>', 'Set default environment in config')
84
- .action(async(options) => {
85
- try {
86
- const setController = options.setController || options['set-controller'];
87
- const setEnvironment = options.setEnvironment || options['set-environment'];
88
- if (setController || setEnvironment) {
89
- await handleAuthConfig({
90
- setController,
91
- setEnvironment
92
- });
93
- return;
94
- }
95
- await handleAuthStatus(options);
96
- } catch (error) {
97
- handleCommandError(error, 'auth');
98
- process.exit(1);
99
- }
100
- });
101
-
102
- auth.command('set-controller <url>')
103
- .description('Set default controller URL in config (alias for auth --set-controller)')
104
- .action(async(url) => {
105
- try {
106
- await handleAuthConfig({ setController: url });
107
- } catch (error) {
108
- handleCommandError(error, 'auth set-controller');
109
- process.exit(1);
110
- }
111
- });
190
+ .action(createAuthParentAction());
112
191
 
113
- auth.command('set-environment <env>')
114
- .description('Set default environment in config (alias for auth --set-environment)')
115
- .action(async(env) => {
116
- try {
117
- await handleAuthConfig({ setEnvironment: env });
118
- } catch (error) {
119
- handleCommandError(error, 'auth set-environment');
120
- process.exit(1);
121
- }
122
- });
192
+ registerAuthSetControllerSubcommand(auth);
193
+ registerAuthSetEnvironmentSubcommand(auth);
123
194
 
124
195
  auth.command('status')
125
196
  .description('Show tokens/session for current controller and environment')
126
- .option('--validate', 'Exit with code 1 when not authenticated (for scripted use, e.g. manual test setup)')
127
- .action(authStatusHandler);
197
+ .addHelpText('after', AUTH_STATUS_HELP_AFTER)
198
+ .option('--validate', 'Exit 1 when not authenticated, 3 when Builder CLI < dataplane minimum, 0 otherwise (for CI/scripts)')
199
+ .action(createAuthStatusAction());
128
200
  }
129
201
 
130
202
  /**
@@ -137,4 +209,4 @@ function setupAuthCommands(program) {
137
209
  setupAuthSubcommands(program);
138
210
  }
139
211
 
140
- module.exports = { setupAuthCommands };
212
+ module.exports = { setupAuthCommands, AUTH_STATUS_HELP_AFTER };
@@ -42,8 +42,11 @@ function setupDownloadCommand(program) {
42
42
 
43
43
  function setupUploadCommand(program) {
44
44
  program.command('upload <systemKey>')
45
- .description('Validate, publish to dataplane, and register with controller (draft application)')
45
+ .description('Validate, publish to dataplane, and register with controller (draft application); or upload .protection batch')
46
46
  .option('--dry-run', 'Validate and build payload only; no API calls')
47
+ .option('--no-sync', 'For .protection: skip datasource sync after upload')
48
+ .option('--json', 'For .protection: JSON output')
49
+ .option('--warnings-as-errors', 'For .protection: pass strict=true to dataplane validate')
47
50
  .option('-v, --verbose', 'Run server-side pipeline validate and print warnings before publish')
48
51
  .option('--probe', 'After publish, run dataplane runtime checks (validation/run); slower')
49
52
  .option('--minimal', 'Print only a short readiness summary after upload')
@@ -54,6 +57,26 @@ function setupUploadCommand(program) {
54
57
  )
55
58
  .action(async(systemKey, options) => {
56
59
  try {
60
+ const { isProtectionScope } = require('../protection/scope');
61
+ if (isProtectionScope(systemKey)) {
62
+ const { uploadProtectionBatchCommand } = require('../protection/upload-batch');
63
+ const logger = require('../utils/logger');
64
+ const code = await uploadProtectionBatchCommand(
65
+ {
66
+ env: options.env,
67
+ dryRun: options.dryRun === true,
68
+ noSync: options.noSync === true,
69
+ json: options.json === true,
70
+ verbose: options.verbose === true,
71
+ warningsAsErrors: options.warningsAsErrors === true
72
+ },
73
+ logger
74
+ );
75
+ if (code !== 0) {
76
+ process.exit(code);
77
+ }
78
+ return;
79
+ }
57
80
  const upload = require('../commands/upload');
58
81
  const probeTimeout =
59
82
  options.probeTimeout === undefined || options.probeTimeout === null
@@ -79,6 +102,17 @@ function setupDeleteCommand(program) {
79
102
  .option('--force', 'Skip confirmation prompt (alias for --yes)')
80
103
  .action(async(systemKey, options) => {
81
104
  try {
105
+ const { isProtectionScope } = require('../protection/scope');
106
+ if (isProtectionScope(systemKey)) {
107
+ const logger = require('../utils/logger');
108
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
109
+ logger.error(
110
+ formatBlockingError(
111
+ 'delete .protection is not supported. Use: aifabrix protection delete <datasourceKey>'
112
+ )
113
+ );
114
+ process.exit(1);
115
+ }
82
116
  const externalDelete = require('../external-system/delete');
83
117
  await externalDelete.deleteExternalSystem(systemKey, options);
84
118
  } catch (error) {
@@ -186,8 +220,8 @@ async function runTestIntegrationCommand(appName, options) {
186
220
 
187
221
  function setupExternalSystemTestCommands(program) {
188
222
  // 'test <app>' is registered in setup-app.js and dispatches by app type (builder vs external)
189
- program.command('test-integration <app>')
190
- .description('Integration tests: builder in container; external via dataplane')
223
+ program.command('test-integration <appKey|systemKey>')
224
+ .description('Integration tests: builder appKey in container; external systemKey via dataplane')
191
225
  .option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
192
226
  .option('-v, --verbose', 'Show detailed test output')
193
227
  .option('-d, --debug', 'Include debug output and write log to integration/<systemKey>/logs/')
@@ -0,0 +1,111 @@
1
+ /**
2
+ * `aifabrix up-dataplane` action body (keeps setup-infra.js under size limits).
3
+ *
4
+ * @fileoverview up-dataplane CLI action
5
+ * @author AI Fabrix Team
6
+ * @version 2.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const logger = require('../utils/logger');
13
+ const { formatProgress } = require('../utils/cli-test-layout-chalk');
14
+ const { handleCommandError, isAuthenticationError } = require('../utils/cli-utils');
15
+ const { resolveControllerUrl } = require('../utils/controller-url');
16
+ const { handleLogin } = require('../commands/login');
17
+ const { handleUpDataplane } = require('../commands/up-dataplane');
18
+ const { cleanBuilderAppDirs } = require('../commands/up-common');
19
+ const { runGuidedUpDataplane } = require('./infra-guided');
20
+ const { recordInfraInstallationCommand } = require('./installation-log-command');
21
+
22
+ /**
23
+ * @param {Object} options
24
+ * @returns {Promise<string[]>}
25
+ */
26
+ async function runUpDataplaneWork(options) {
27
+ let cleanedAppKeys = [];
28
+ if (options.force) {
29
+ const c = await cleanBuilderAppDirs(['dataplane']);
30
+ cleanedAppKeys = Array.isArray(c) ? c : [];
31
+ }
32
+ if (!options.verbose) {
33
+ await runGuidedUpDataplane(options, handleUpDataplane);
34
+ } else {
35
+ await handleUpDataplane(options);
36
+ }
37
+ return cleanedAppKeys;
38
+ }
39
+
40
+ /**
41
+ * @param {Object} params
42
+ * @returns {Promise<void>}
43
+ */
44
+ async function logDataplaneOutcome(params) {
45
+ const { options, startedAt, outcome, error, cleanedAppKeys } = params;
46
+ await recordInfraInstallationCommand({
47
+ command: 'up-dataplane',
48
+ options,
49
+ startedAt,
50
+ outcome,
51
+ error,
52
+ platformAppList: ['dataplane'],
53
+ cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined
54
+ });
55
+ }
56
+
57
+ /**
58
+ * @param {Object} options
59
+ * @param {Date} startedAt
60
+ * @param {string[]} cleanedAppKeys
61
+ * @param {string} controllerUrl
62
+ * @returns {Promise<void>}
63
+ */
64
+ async function runDataplaneAuthRecovery(options, startedAt, cleanedAppKeys, controllerUrl) {
65
+ if (!options.verbose) {
66
+ logger.log(formatProgress('Authenticating...'));
67
+ } else {
68
+ logger.log(chalk.blue('\nAuthentication required. Running aifabrix login...\n'));
69
+ }
70
+ await handleLogin({ method: 'device', controller: controllerUrl, compact: !options.verbose });
71
+ await handleUpDataplane(options);
72
+ await logDataplaneOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
73
+ }
74
+
75
+ /**
76
+ * @param {Object} options
77
+ * @returns {Promise<void>}
78
+ */
79
+ async function handleUpDataplaneCliAction(options) {
80
+ const startedAt = new Date();
81
+ let cleanedAppKeys = [];
82
+ try {
83
+ cleanedAppKeys = await runUpDataplaneWork(options);
84
+ await logDataplaneOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
85
+ } catch (error) {
86
+ if (isAuthenticationError(error)) {
87
+ const controllerUrl = error.controllerUrl || await resolveControllerUrl();
88
+ try {
89
+ await runDataplaneAuthRecovery(options, startedAt, cleanedAppKeys, controllerUrl);
90
+ return;
91
+ } catch (loginOrRetryError) {
92
+ await logDataplaneOutcome({
93
+ options,
94
+ startedAt,
95
+ outcome: 'failure',
96
+ error: loginOrRetryError,
97
+ cleanedAppKeys
98
+ });
99
+ handleCommandError(loginOrRetryError, 'up-dataplane');
100
+ process.exit(1);
101
+ }
102
+ }
103
+ await logDataplaneOutcome({ options, startedAt, outcome: 'failure', error, cleanedAppKeys });
104
+ handleCommandError(error, 'up-dataplane');
105
+ process.exit(1);
106
+ }
107
+ }
108
+
109
+ module.exports = {
110
+ handleUpDataplaneCliAction
111
+ };
@@ -0,0 +1,131 @@
1
+ /**
2
+ * `aifabrix up-platform` action body (keeps setup-infra.js under size limits).
3
+ *
4
+ * @fileoverview up-platform CLI action
5
+ * @author AI Fabrix Team
6
+ * @version 2.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const logger = require('../utils/logger');
13
+ const { formatProgress } = require('../utils/cli-test-layout-chalk');
14
+ const { handleCommandError, isAuthenticationError } = require('../utils/cli-utils');
15
+ const { resolveControllerUrl } = require('../utils/controller-url');
16
+ const { handleLogin } = require('../commands/login');
17
+ const { handleUpMiso } = require('../commands/up-miso');
18
+ const { handleUpDataplane } = require('../commands/up-dataplane');
19
+ const {
20
+ applyUpPlatformForceConfig,
21
+ cleanBuilderAppDirs,
22
+ prepareUrlsLocalRegistryForUpPlatform
23
+ } = require('../commands/up-common');
24
+ const { runGuidedUpPlatform } = require('./infra-guided');
25
+ const { recordInfraInstallationCommand } = require('./installation-log-command');
26
+
27
+ const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane'];
28
+
29
+ /**
30
+ * @param {Object} options
31
+ * @returns {Promise<string[]>}
32
+ */
33
+ async function runUpPlatformWork(options) {
34
+ let cleanedAppKeys = [];
35
+ let platformForceCleanSummary = null;
36
+ if (options.force) {
37
+ const forceSummary = await applyUpPlatformForceConfig({ silent: !options.verbose });
38
+ const cleanedApps = await cleanBuilderAppDirs(PLATFORM_APPS, {
39
+ silent: !options.verbose
40
+ });
41
+ cleanedAppKeys = Array.isArray(cleanedApps) ? cleanedApps : [];
42
+ if (!options.verbose) {
43
+ platformForceCleanSummary = { forceSummary, cleanedApps: cleanedAppKeys };
44
+ }
45
+ }
46
+
47
+ if (!options.verbose) {
48
+ await runGuidedUpPlatform(
49
+ options,
50
+ handleUpMiso,
51
+ handleUpDataplane,
52
+ handleLogin,
53
+ platformForceCleanSummary
54
+ );
55
+ } else {
56
+ await prepareUrlsLocalRegistryForUpPlatform();
57
+ await handleUpMiso(options);
58
+ await handleUpDataplane(options);
59
+ }
60
+ return cleanedAppKeys;
61
+ }
62
+
63
+ /**
64
+ * @param {Object} params
65
+ * @returns {Promise<void>}
66
+ */
67
+ async function logUpPlatformOutcome(params) {
68
+ const { options, startedAt, outcome, error, cleanedAppKeys } = params;
69
+ await recordInfraInstallationCommand({
70
+ command: 'up-platform',
71
+ options,
72
+ startedAt,
73
+ outcome,
74
+ error,
75
+ platformAppList: PLATFORM_APPS,
76
+ cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined,
77
+ upPlatformForce: options.force === true
78
+ });
79
+ }
80
+
81
+ async function maybeHandleUpPlatformAuthRetry(error, options) {
82
+ if (!isAuthenticationError(error)) {
83
+ return false;
84
+ }
85
+ const controllerUrl = error.controllerUrl || await resolveControllerUrl();
86
+ if (!options.verbose) {
87
+ logger.log(formatProgress('Authenticating...'));
88
+ } else {
89
+ logger.log(chalk.blue('\nAuthentication required. Running aifabrix login...\n'));
90
+ }
91
+ await handleLogin({ method: 'device', controller: controllerUrl, compact: !options.verbose });
92
+ await handleUpDataplane(options);
93
+ return true;
94
+ }
95
+
96
+ /**
97
+ * @param {Object} options
98
+ * @returns {Promise<void>}
99
+ */
100
+ async function handleUpPlatformCliAction(options) {
101
+ const startedAt = new Date();
102
+ let cleanedAppKeys = [];
103
+ try {
104
+ cleanedAppKeys = await runUpPlatformWork(options);
105
+ await logUpPlatformOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
106
+ } catch (error) {
107
+ try {
108
+ if (await maybeHandleUpPlatformAuthRetry(error, options)) {
109
+ await logUpPlatformOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
110
+ return;
111
+ }
112
+ } catch (loginOrRetryError) {
113
+ await logUpPlatformOutcome({
114
+ options,
115
+ startedAt,
116
+ outcome: 'failure',
117
+ error: loginOrRetryError,
118
+ cleanedAppKeys
119
+ });
120
+ handleCommandError(loginOrRetryError, 'up-platform');
121
+ process.exit(1);
122
+ }
123
+ await logUpPlatformOutcome({ options, startedAt, outcome: 'failure', error, cleanedAppKeys });
124
+ handleCommandError(error, 'up-platform');
125
+ process.exit(1);
126
+ }
127
+ }
128
+
129
+ module.exports = {
130
+ handleUpPlatformCliAction
131
+ };