@aifabrix/builder 2.45.0 → 2.46.0

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 (352) hide show
  1. package/.cursor/rules/cli-layout.mdc +2 -0
  2. package/.cursor/rules/cli-product-neutral.mdc +43 -0
  3. package/.cursor/rules/docs-rules.mdc +3 -1
  4. package/.cursor/rules/project-rules.mdc +1 -0
  5. package/README.md +43 -17
  6. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  7. package/jest.config.default.js +2 -1
  8. package/jest.config.isolated.js +2 -1
  9. package/jest.global-live-fabrix-hooks.js +36 -0
  10. package/jest.isolated-projects.js +130 -0
  11. package/jest.projects.js +69 -121
  12. package/lib/api/agent-metadata-validation.api.js +93 -0
  13. package/lib/api/api-response-errors.js +124 -0
  14. package/lib/api/audit-api-helpers.js +68 -0
  15. package/lib/api/audit.api.js +119 -0
  16. package/lib/api/auth-cache.api.js +44 -0
  17. package/lib/api/certificates.api.js +4 -4
  18. package/lib/api/credential.api.js +2 -2
  19. package/lib/api/dataplane-health.api.js +137 -0
  20. package/lib/api/dataplane-sync.api.js +27 -0
  21. package/lib/api/datasources-core.api.js +21 -18
  22. package/lib/api/datasources-extended.api.js +22 -22
  23. package/lib/api/dimensions.api.js +3 -0
  24. package/lib/api/external-systems.api.js +13 -13
  25. package/lib/api/governance-scenario-pack.api.js +159 -0
  26. package/lib/api/governance-scenarios.api.js +39 -0
  27. package/lib/api/groups.api.js +79 -0
  28. package/lib/api/index.js +88 -5
  29. package/lib/api/lifecycle.api.js +77 -0
  30. package/lib/api/pipeline.api.js +7 -5
  31. package/lib/api/protection.api.js +157 -0
  32. package/lib/api/records-bulk.api.js +43 -0
  33. package/lib/api/records-search-parse.js +49 -0
  34. package/lib/api/records-search.api.js +29 -0
  35. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  36. package/lib/api/types/audit.types.js +72 -0
  37. package/lib/api/types/dataplane-health.types.js +27 -0
  38. package/lib/api/types/dimensions.types.js +2 -0
  39. package/lib/api/types/governance-scenarios.types.js +39 -0
  40. package/lib/api/types/protection.types.js +69 -0
  41. package/lib/api/types/records-bulk.types.js +35 -0
  42. package/lib/api/types/records-search.types.js +28 -0
  43. package/lib/api/user-groups.api.js +50 -0
  44. package/lib/api/users.api.js +95 -0
  45. package/lib/api/validation-run.api.js +3 -3
  46. package/lib/api/validation-runner.js +5 -3
  47. package/lib/api/wizard-platform.api.js +3 -3
  48. package/lib/api/wizard.api.js +21 -21
  49. package/lib/app/deploy-config.js +4 -1
  50. package/lib/app/deploy.js +34 -19
  51. package/lib/app/down.js +20 -1
  52. package/lib/app/push.js +4 -5
  53. package/lib/app/register.js +7 -4
  54. package/lib/app/run-env-compose.js +84 -30
  55. package/lib/build/index.js +5 -0
  56. package/lib/certification/sync-system-certification.js +13 -6
  57. package/lib/cli/index.js +8 -2
  58. package/lib/cli/infra-guided-auth.js +109 -0
  59. package/lib/cli/infra-guided.js +91 -69
  60. package/lib/cli/setup-app.help.js +19 -2
  61. package/lib/cli/setup-app.js +58 -23
  62. package/lib/cli/setup-app.test-commands.js +28 -21
  63. package/lib/cli/setup-auth.js +55 -3
  64. package/lib/cli/setup-certification-commands.js +147 -0
  65. package/lib/cli/setup-certification.help.js +141 -0
  66. package/lib/cli/setup-environment.js +19 -2
  67. package/lib/cli/setup-external-system-help.js +62 -0
  68. package/lib/cli/setup-external-system.js +62 -6
  69. package/lib/cli/setup-infra.js +9 -1
  70. package/lib/cli/setup-platform.js +6 -1
  71. package/lib/cli/setup-secrets.js +33 -1
  72. package/lib/cli/setup-utility-help-after.js +65 -0
  73. package/lib/cli/setup-utility-repair.js +198 -0
  74. package/lib/cli/setup-utility-resolve.js +42 -6
  75. package/lib/cli/setup-utility-validate.js +197 -0
  76. package/lib/cli/setup-utility.js +41 -258
  77. package/lib/commands/auth-status-client-tokens.js +214 -0
  78. package/lib/commands/auth-status-dataplane-version.js +269 -0
  79. package/lib/commands/auth-status-display.js +94 -0
  80. package/lib/commands/auth-status.js +111 -53
  81. package/lib/commands/credential-push.js +10 -5
  82. package/lib/commands/datasource-load-export-cli.js +178 -0
  83. package/lib/commands/datasource-test-trust-cli.js +118 -0
  84. package/lib/commands/datasource-unified-test-cli.js +31 -20
  85. package/lib/commands/datasource-unified-test-cli.options.js +22 -3
  86. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  87. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  88. package/lib/commands/datasource.js +68 -1
  89. package/lib/commands/dev-show-display.js +8 -1
  90. package/lib/commands/dimension-value.js +43 -13
  91. package/lib/commands/dimension.js +38 -7
  92. package/lib/commands/governance-cli-shared.js +94 -0
  93. package/lib/commands/governance-command-action.js +132 -0
  94. package/lib/commands/governance-download-external.js +34 -0
  95. package/lib/commands/governance-generate-external.js +71 -0
  96. package/lib/commands/governance-upload-external.js +36 -0
  97. package/lib/commands/governance-verify-external.js +64 -0
  98. package/lib/commands/governance.js +144 -0
  99. package/lib/commands/identity-apply-sync.js +131 -0
  100. package/lib/commands/identity-group-cli.js +146 -0
  101. package/lib/commands/identity-membership-role-cache.js +175 -0
  102. package/lib/commands/identity-shared.js +94 -0
  103. package/lib/commands/identity-user-cli.js +158 -0
  104. package/lib/commands/identity.js +43 -0
  105. package/lib/commands/lifecycle-command-action.js +123 -0
  106. package/lib/commands/lifecycle-external.js +268 -0
  107. package/lib/commands/login.js +56 -17
  108. package/lib/commands/protection-cli-leaves.js +286 -0
  109. package/lib/commands/protection.js +50 -0
  110. package/lib/commands/repair-auth-apply.js +127 -0
  111. package/lib/commands/repair-changed-files.js +41 -0
  112. package/lib/commands/repair-datasource-keys.js +4 -1
  113. package/lib/commands/repair-datasource-run.js +59 -0
  114. package/lib/commands/repair-datasource-test-payload.js +259 -0
  115. package/lib/commands/repair-datasource.js +1 -51
  116. package/lib/commands/repair-env-template.js +64 -13
  117. package/lib/commands/repair-external-run.js +216 -0
  118. package/lib/commands/repair-openapi-sync.js +23 -0
  119. package/lib/commands/repair-persist.js +4 -0
  120. package/lib/commands/repair-rbac.js +52 -1
  121. package/lib/commands/repair-steps.js +145 -0
  122. package/lib/commands/repair.js +29 -286
  123. package/lib/commands/secrets-get.js +184 -0
  124. package/lib/commands/secrets-remove-all.js +3 -1
  125. package/lib/commands/setup-image-refresh.js +146 -0
  126. package/lib/commands/setup-modes.js +158 -162
  127. package/lib/commands/setup-platform-auth.js +76 -0
  128. package/lib/commands/setup-prompts-admin.js +244 -0
  129. package/lib/commands/setup-prompts-platform-mode.js +67 -0
  130. package/lib/commands/setup-prompts-validators.js +36 -0
  131. package/lib/commands/setup-prompts.js +24 -76
  132. package/lib/commands/setup-run-context.js +45 -0
  133. package/lib/commands/setup-spinners.js +39 -0
  134. package/lib/commands/setup.js +27 -5
  135. package/lib/commands/teardown.js +39 -0
  136. package/lib/commands/test-e2e-external.js +61 -14
  137. package/lib/commands/test-governance-cli-options.js +47 -0
  138. package/lib/commands/test-governance-external.js +67 -0
  139. package/lib/commands/test-trust-cli-options.js +32 -0
  140. package/lib/commands/test-trust-external.js +126 -0
  141. package/lib/commands/up-common.js +25 -13
  142. package/lib/commands/up-dataplane.js +50 -13
  143. package/lib/commands/upload-publish-context.js +75 -0
  144. package/lib/commands/upload-sidecar-followups.js +89 -0
  145. package/lib/commands/upload.js +108 -105
  146. package/lib/commands/verify-governance-combined-external.js +61 -0
  147. package/lib/commands/verify-governance-command-action.js +64 -0
  148. package/lib/commands/verify-governance-db.js +102 -0
  149. package/lib/commands/verify-governance-external.js +77 -0
  150. package/lib/commands/verify-governance-result-builders.js +71 -0
  151. package/lib/commands/verify-operations-command-action.js +68 -0
  152. package/lib/commands/verify-operations-external.js +268 -0
  153. package/lib/commands/verify-operations-persist.js +75 -0
  154. package/lib/commands/verify-operations-step-plan.js +68 -0
  155. package/lib/commands/verify-operations-steps.js +111 -0
  156. package/lib/commands/verify-trust-command-action.js +70 -0
  157. package/lib/commands/verify-trust-external.js +67 -0
  158. package/lib/commands/wizard-config-normalizer.js +43 -23
  159. package/lib/commands/wizard-core.js +5 -0
  160. package/lib/core/admin-password-generator.js +38 -0
  161. package/lib/core/admin-secrets-bundle.js +111 -0
  162. package/lib/core/admin-secrets-env-overlay.js +62 -0
  163. package/lib/core/admin-secrets.js +32 -4
  164. package/lib/core/config-attach-extensions.js +3 -0
  165. package/lib/core/config-device-dataplane.js +185 -0
  166. package/lib/core/config-platform-controller.js +44 -0
  167. package/lib/core/config-setup-installation-profile.js +42 -0
  168. package/lib/core/config-setup-platform-mode.js +46 -0
  169. package/lib/core/config.js +46 -36
  170. package/lib/core/secrets-admin-env.js +6 -2
  171. package/lib/core/secrets-ensure.js +4 -0
  172. package/lib/core/secrets-env-content.js +54 -48
  173. package/lib/core/secrets-env-write.js +10 -1
  174. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  175. package/lib/core/setup-installation-profile.js +43 -0
  176. package/lib/core/setup-platform-mode.js +55 -0
  177. package/lib/datasource/agent-trust-debug-log.js +45 -0
  178. package/lib/datasource/agent-trust-fetch.js +115 -0
  179. package/lib/datasource/agent-trust-map.js +101 -0
  180. package/lib/datasource/agent-trust-mock.js +44 -0
  181. package/lib/datasource/agent-trust-run.js +95 -0
  182. package/lib/datasource/agent-trust-timeout.js +25 -0
  183. package/lib/datasource/audit-evidence-display.js +80 -0
  184. package/lib/datasource/audit-evidence-extract-debug.js +115 -0
  185. package/lib/datasource/audit-evidence-extract.js +180 -0
  186. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  187. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  188. package/lib/datasource/audit-evidence-poll.js +109 -0
  189. package/lib/datasource/audit-evidence-run.js +177 -0
  190. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  191. package/lib/datasource/audit-evidence-verify-matrix.js +205 -0
  192. package/lib/datasource/audit-evidence-verify.js +108 -0
  193. package/lib/datasource/bulk-loader-run-batches.js +100 -0
  194. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  195. package/lib/datasource/bulk-loader-service.js +127 -0
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  197. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  198. package/lib/datasource/datasource-exporter-service.js +144 -0
  199. package/lib/datasource/datasource-identifier.js +148 -0
  200. package/lib/datasource/datasource-load-export-context.js +95 -0
  201. package/lib/datasource/integration-context.js +6 -4
  202. package/lib/datasource/local-data-paths.js +145 -0
  203. package/lib/datasource/log-cleaner.js +241 -0
  204. package/lib/datasource/log-viewer.js +111 -6
  205. package/lib/datasource/record-file-parser.js +85 -0
  206. package/lib/datasource/record-mapper.js +129 -0
  207. package/lib/datasource/resolve-app.js +74 -55
  208. package/lib/datasource/test-e2e.js +29 -2
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  211. package/lib/datasource/unified-validation-run.js +47 -18
  212. package/lib/datasource/validate.js +37 -20
  213. package/lib/deployment/environment-poll-status.js +138 -0
  214. package/lib/deployment/environment.js +42 -34
  215. package/lib/external-system/download.js +21 -20
  216. package/lib/external-system/generator.js +5 -1
  217. package/lib/external-system/integration-auth-context.js +45 -0
  218. package/lib/external-system/test-auth.js +12 -5
  219. package/lib/external-system/test-system-level.js +25 -4
  220. package/lib/external-system/test.js +9 -7
  221. package/lib/generator/external-controller-manifest.js +15 -0
  222. package/lib/governance/governance-cli-errors.js +96 -0
  223. package/lib/governance/governance-download-display.js +38 -0
  224. package/lib/governance/governance-pack-loader.js +70 -0
  225. package/lib/governance/governance-run-display.js +309 -0
  226. package/lib/identity/identity-apply-core.js +108 -0
  227. package/lib/identity/identity-apply-phases.js +244 -0
  228. package/lib/identity/identity-apply-service.js +77 -0
  229. package/lib/identity/identity-csv-parser.js +114 -0
  230. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  231. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  232. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  233. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  234. package/lib/infrastructure/helpers.js +23 -129
  235. package/lib/infrastructure/index.js +5 -6
  236. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  237. package/lib/internal/fs-real-sync.js +29 -1
  238. package/lib/lifecycle/certification-progress.js +231 -0
  239. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  240. package/lib/lifecycle/exit-codes.js +24 -0
  241. package/lib/lifecycle/json-envelope.js +25 -0
  242. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  243. package/lib/lifecycle/logger-quiet.js +29 -0
  244. package/lib/lifecycle/open-api-published.js +59 -0
  245. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  246. package/lib/lifecycle/product-model.js +196 -0
  247. package/lib/lifecycle/report-display.js +471 -0
  248. package/lib/lifecycle/scenario-upload.js +191 -0
  249. package/lib/lifecycle/verify-step-progress.js +87 -0
  250. package/lib/parameters/infra-kv-discovery.js +27 -2
  251. package/lib/protection/auth-context.js +51 -0
  252. package/lib/protection/convert-batch.js +90 -0
  253. package/lib/protection/load.js +41 -0
  254. package/lib/protection/paths.js +158 -0
  255. package/lib/protection/preflight-datasource-ready.js +46 -0
  256. package/lib/protection/protection-create-probe-lines.js +142 -0
  257. package/lib/protection/protection-create-probes.js +95 -0
  258. package/lib/protection/protection-create-scaffold.js +281 -0
  259. package/lib/protection/protection-display-helpers.js +445 -0
  260. package/lib/protection/protection-display.js +215 -0
  261. package/lib/protection/protection-preset-registry.js +97 -0
  262. package/lib/protection/report-exit.js +62 -0
  263. package/lib/protection/resolve.js +202 -0
  264. package/lib/protection/run-commands-validate.js +130 -0
  265. package/lib/protection/run-commands.js +216 -0
  266. package/lib/protection/run-protection-create-helpers.js +134 -0
  267. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  268. package/lib/protection/run-protection-create.js +191 -0
  269. package/lib/protection/scope.js +22 -0
  270. package/lib/protection/sync-after-upload.js +64 -0
  271. package/lib/protection/upload-batch.js +127 -0
  272. package/lib/protection/validate-batch.js +113 -0
  273. package/lib/protection/validate-local.js +65 -0
  274. package/lib/resolvers/dimension-file.js +29 -4
  275. package/lib/schema/application-schema.json +1 -1
  276. package/lib/schema/datasource-test-run.schema.json +89 -6
  277. package/lib/schema/external-datasource.schema.json +2636 -2588
  278. package/lib/schema/external-system.schema.json +1089 -761
  279. package/lib/schema/flag-map-validation-run.json +2 -2
  280. package/lib/schema/infra.parameter.yaml +45 -0
  281. package/lib/schema/protection.schema.json +374 -0
  282. package/lib/schema/type/credential-field-registry.json +642 -0
  283. package/lib/schema/wizard-config.schema.json +1 -1
  284. package/lib/utils/agent-trust-run-display.js +231 -0
  285. package/lib/utils/agent-trust-run-exit.js +59 -0
  286. package/lib/utils/agent-trust-wait-ui.js +94 -0
  287. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  288. package/lib/utils/api.js +55 -31
  289. package/lib/utils/app-relative-path-env.js +112 -0
  290. package/lib/utils/cli-exit-codes.js +30 -0
  291. package/lib/utils/cli-secrets-error-format.js +83 -21
  292. package/lib/utils/cli-sync-options.js +33 -0
  293. package/lib/utils/cli-utils.js +16 -4
  294. package/lib/utils/compose-generate-docker-compose.js +4 -0
  295. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  296. package/lib/utils/config-secrets-path.js +46 -0
  297. package/lib/utils/controller-url.js +88 -1
  298. package/lib/utils/credential-push-ui.js +90 -0
  299. package/lib/utils/credential-secrets-env.js +137 -9
  300. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  301. package/lib/utils/dataplane-cli-version-help.js +74 -0
  302. package/lib/utils/dataplane-resolver.js +129 -2
  303. package/lib/utils/datasource-export-display.js +137 -0
  304. package/lib/utils/datasource-load-display.js +174 -0
  305. package/lib/utils/datasource-load-export-ui.js +120 -0
  306. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  307. package/lib/utils/datasource-test-run-display.js +3 -3
  308. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  309. package/lib/utils/declarative-url-ports.js +3 -3
  310. package/lib/utils/deployment-auth-mode.js +41 -0
  311. package/lib/utils/developer-volume-id.js +33 -0
  312. package/lib/utils/env-copy.js +14 -9
  313. package/lib/utils/env-kv-orphan-lines.js +43 -0
  314. package/lib/utils/error-formatters/network-errors.js +13 -4
  315. package/lib/utils/external-env-template.js +1 -0
  316. package/lib/utils/external-system-readiness-core.js +10 -0
  317. package/lib/utils/external-system-readiness-display.js +80 -23
  318. package/lib/utils/health-check.js +4 -1
  319. package/lib/utils/help-builder.js +35 -26
  320. package/lib/utils/keycloak-realm-ready.js +101 -0
  321. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  322. package/lib/utils/manifest-source-emit.js +24 -0
  323. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  324. package/lib/utils/platform-controller-url.js +156 -0
  325. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  326. package/lib/utils/postgres-wipe.js +9 -2
  327. package/lib/utils/resolve-env-mode.js +47 -0
  328. package/lib/utils/secrets-generator.js +31 -25
  329. package/lib/utils/secrets-missing-error.js +164 -0
  330. package/lib/utils/semver-compare.js +127 -0
  331. package/lib/utils/service-url-label.js +81 -0
  332. package/lib/utils/setup-quiet-output.js +25 -0
  333. package/lib/utils/template-helpers.js +15 -0
  334. package/lib/utils/token-manager-client-credentials.js +201 -0
  335. package/lib/utils/token-manager-messages.js +8 -0
  336. package/lib/utils/token-manager-refresh.js +12 -2
  337. package/lib/utils/token-manager.js +86 -105
  338. package/lib/utils/upload-pipeline-ui.js +98 -0
  339. package/lib/utils/upload-sync-options.js +42 -0
  340. package/lib/utils/url-declarative-public-base.js +21 -3
  341. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  342. package/lib/utils/validation-poll-ui.js +22 -7
  343. package/lib/utils/validation-run-stage.js +45 -0
  344. package/lib/validation/wizard-config-validator.js +58 -19
  345. package/package.json +1 -1
  346. package/templates/applications/dataplane/application.yaml +2 -1
  347. package/templates/applications/dataplane/env.template +36 -1
  348. package/templates/applications/dataplane/rbac.yaml +4 -0
  349. package/templates/applications/miso-controller/env.template +16 -0
  350. package/templates/external-system/README.md.hbs +116 -11
  351. package/templates/python/docker-compose.hbs +19 -18
  352. package/templates/typescript/docker-compose.hbs +18 -17
@@ -0,0 +1,94 @@
1
+ /**
2
+ * @fileoverview Shared helpers for governance * CLI commands (424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const {
8
+ resolveExternalIntegrationContext,
9
+ syncLocalIfRequested
10
+ } = require('./test-e2e-external');
11
+ const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
12
+ const { cliOptsSkipSync } = require('../utils/cli-sync-options');
13
+ const { fetchDataplaneGeneralHealth } = require('../api/dataplane-health.api');
14
+ const { formatNetworkError } = require('../utils/api-error-handler');
15
+
16
+ /**
17
+ * @param {Object} options
18
+ * @param {string[]} [options.subjectUserIds]
19
+ * @param {string[]} [options.subjectEmails]
20
+ * @returns {Array<{ subjectUserId?: string, subjectEmail?: string }>}
21
+ */
22
+ function buildSubjectsFromOptions(options) {
23
+ const subjects = [];
24
+ const userIds = options.subjectUserIds || [];
25
+ const emails = options.subjectEmails || [];
26
+ for (const subjectUserId of userIds) {
27
+ const id = String(subjectUserId || '').trim();
28
+ if (id) subjects.push({ subjectUserId: id });
29
+ }
30
+ for (const subjectEmail of emails) {
31
+ const email = String(subjectEmail || '').trim();
32
+ if (email) subjects.push({ subjectEmail: email });
33
+ }
34
+ return subjects;
35
+ }
36
+
37
+ /**
38
+ * Fail fast when dataplane health is unreachable (avoids misleading API validation errors).
39
+ * @async
40
+ * @param {string} dataplaneUrl
41
+ * @returns {Promise<void>}
42
+ */
43
+ async function assertDataplaneReachable(dataplaneUrl) {
44
+ const base = String(dataplaneUrl || '').replace(/\/$/, '');
45
+ const snapshot = await fetchDataplaneGeneralHealth(base, { timeoutMs: 8000 });
46
+ if (snapshot) {
47
+ return;
48
+ }
49
+ const endpointUrl = `${base}/api/v1/health`;
50
+ const err = new Error(`Cannot reach dataplane at ${base}`);
51
+ err.network = true;
52
+ err.serviceLabel = 'dataplane';
53
+ err.endpointUrl = endpointUrl;
54
+ err.formatted = formatNetworkError(err.message, {
55
+ endpointUrl,
56
+ serviceLabel: 'dataplane'
57
+ });
58
+ throw err;
59
+ }
60
+
61
+ /**
62
+ * @async
63
+ * @param {string} systemKey
64
+ * @param {Object} options
65
+ * @returns {Promise<{ resolvedKey: string, keys: string[], authConfig: Object, dataplaneUrl: string }>}
66
+ */
67
+ async function resolveGovernanceIntegrationContext(systemKey, options) {
68
+ const { systemKey: resolvedKey, keys } = resolveExternalIntegrationContext(systemKey);
69
+ if (options.authConfig && options.dataplaneUrl) {
70
+ return {
71
+ resolvedKey,
72
+ keys,
73
+ authConfig: options.authConfig,
74
+ dataplaneUrl: options.dataplaneUrl
75
+ };
76
+ }
77
+ if (!cliOptsSkipSync(options)) {
78
+ const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
79
+ if (uploadCtx?.authConfig && uploadCtx?.dataplaneUrl) {
80
+ options.authConfig = uploadCtx.authConfig;
81
+ options.dataplaneUrl = uploadCtx.dataplaneUrl;
82
+ options.silentResolve = true;
83
+ }
84
+ }
85
+ const { authConfig, dataplaneUrl } = await resolveIntegrationAuth(resolvedKey, options);
86
+ await assertDataplaneReachable(dataplaneUrl);
87
+ return { resolvedKey, keys, authConfig, dataplaneUrl };
88
+ }
89
+
90
+ module.exports = {
91
+ buildSubjectsFromOptions,
92
+ assertDataplaneReachable,
93
+ resolveGovernanceIntegrationContext
94
+ };
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @fileoverview CLI actions for `aifabrix governance *` (424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const logger = require('../utils/logger');
8
+ const { handleCommandError } = require('../utils/cli-utils');
9
+ const { runGovernanceGenerateForExternalSystem } = require('./governance-generate-external');
10
+ const { runGovernanceVerifyForExternalSystem } = require('./governance-verify-external');
11
+ const { runGovernanceUploadForExternalSystem } = require('./governance-upload-external');
12
+ const { runGovernanceDownloadForExternalSystem } = require('./governance-download-external');
13
+ const { displayVerifyGovernanceTTY } = require('../lifecycle/report-display');
14
+ const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
15
+ const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
16
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
17
+
18
+ /**
19
+ * Commander repeatable-option collector. Splits comma-separated values so both
20
+ * `--flag a --flag b` and `--flag a,b` work.
21
+ * @param {string} value
22
+ * @param {string[]} previous
23
+ * @returns {string[]}
24
+ */
25
+ function collectString(value, previous) {
26
+ const parts = String(value)
27
+ .split(',')
28
+ .map(entry => entry.trim())
29
+ .filter(Boolean);
30
+ return previous.concat(parts.length > 0 ? parts : [String(value).trim()].filter(Boolean));
31
+ }
32
+
33
+ function normalizeGovernanceOptions(options, cmd) {
34
+ const parent = cmd && cmd.parent ? cmd.parent.opts() : {};
35
+ return {
36
+ env: options.env || parent.env || 'dev',
37
+ verbose: options.verbose === true || parent.verbose === true,
38
+ noSync: options.noSync === true || parent.noSync === true,
39
+ force: options.force === true || parent.force === true,
40
+ json: options.json === true || parent.json === true,
41
+ pack: options.pack,
42
+ app: options.app,
43
+ scenarioIds: options.scenario || [],
44
+ certificationProfile: options.certificationProfile || 'bronze',
45
+ subjectUserIds: options.subjectUserId || [],
46
+ subjectEmails: options.subjectEmail || [],
47
+ maxSamplesPerPartition: options.maxSamplesPerPartition
48
+ };
49
+ }
50
+
51
+ async function governanceGenerateHandler(systemKey, options, cmd) {
52
+ try {
53
+ const opts = normalizeGovernanceOptions(options, cmd);
54
+ const result = await runGovernanceGenerateForExternalSystem(systemKey, opts);
55
+ if (opts.json) {
56
+ logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
57
+ return;
58
+ }
59
+ for (const row of result.results || []) {
60
+ logger.log(
61
+ formatSuccessLine(
62
+ `${row.datasourceKey}: pack v${row.packVersion} (${row.scenarioCount} scenarios)`
63
+ )
64
+ );
65
+ }
66
+ } catch (error) {
67
+ handleCommandError(error, 'governance generate');
68
+ process.exit(3);
69
+ }
70
+ }
71
+
72
+ async function governanceVerifyHandler(systemKey, options, cmd) {
73
+ try {
74
+ const opts = normalizeGovernanceOptions(options, cmd);
75
+ const result = await runGovernanceVerifyForExternalSystem(systemKey, opts);
76
+ if (opts.json) {
77
+ logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
78
+ } else {
79
+ displayVerifyGovernanceTTY(result.systemKey, result, { details: opts.verbose });
80
+ }
81
+ const exitCode = exitCodeFromVerdict(result.verdict);
82
+ if (exitCode !== 0) {
83
+ process.exit(exitCode);
84
+ }
85
+ } catch (error) {
86
+ handleCommandError(error, 'governance verify');
87
+ process.exit(3);
88
+ }
89
+ }
90
+
91
+ async function governanceUploadHandler(systemKey, options, cmd) {
92
+ try {
93
+ const opts = normalizeGovernanceOptions(options, cmd);
94
+ const result = await runGovernanceUploadForExternalSystem(systemKey, opts);
95
+ if (opts.json) {
96
+ logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
97
+ return;
98
+ }
99
+ logger.log(formatSuccessLine(`Uploaded ${result.uploaded} scenario pack(s)`));
100
+ } catch (error) {
101
+ if (error.friendlyHint) {
102
+ logger.log(error.friendlyHint);
103
+ }
104
+ handleCommandError(error, 'governance upload');
105
+ process.exit(3);
106
+ }
107
+ }
108
+
109
+ async function governanceDownloadHandler(systemKey, options, cmd) {
110
+ try {
111
+ const opts = normalizeGovernanceOptions(options, cmd);
112
+ opts.noSync = true;
113
+ const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
114
+ if (opts.json) {
115
+ logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
116
+ return;
117
+ }
118
+ logger.log(formatSuccessLine(`Downloaded ${result.written} scenario pack(s)`));
119
+ } catch (error) {
120
+ handleCommandError(error, 'governance download');
121
+ process.exit(3);
122
+ }
123
+ }
124
+
125
+ module.exports = {
126
+ collectString,
127
+ normalizeGovernanceOptions,
128
+ governanceGenerateHandler,
129
+ governanceVerifyHandler,
130
+ governanceUploadHandler,
131
+ governanceDownloadHandler
132
+ };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview governance download — pull packs to integration/<systemKey>/scenarios/ (424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const { downloadGovernanceScenarioPacks } = require('../lifecycle/scenario-upload');
8
+ const { resolveGovernanceIntegrationContext } = require('./governance-cli-shared');
9
+
10
+ /**
11
+ * @async
12
+ * @param {string} systemKey
13
+ * @param {Object} options
14
+ * @returns {Promise<Object>}
15
+ */
16
+ async function runGovernanceDownloadForExternalSystem(systemKey, options = {}) {
17
+ const { resolvedKey, keys, authConfig, dataplaneUrl } =
18
+ await resolveGovernanceIntegrationContext(systemKey, options);
19
+ const written = await downloadGovernanceScenarioPacks(
20
+ resolvedKey,
21
+ keys,
22
+ dataplaneUrl,
23
+ authConfig
24
+ );
25
+ return {
26
+ systemKey: resolvedKey,
27
+ command: 'governance download',
28
+ written
29
+ };
30
+ }
31
+
32
+ module.exports = {
33
+ runGovernanceDownloadForExternalSystem
34
+ };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @fileoverview governance generate — dataplane POST generate per datasource (424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const { generateDatasourceGovernancePack } = require('../api/governance-scenario-pack.api');
8
+ const {
9
+ buildSubjectsFromOptions,
10
+ resolveGovernanceIntegrationContext
11
+ } = require('./governance-cli-shared');
12
+ const { runWithVerifyStepProgress } = require('../lifecycle/verify-step-progress');
13
+
14
+ /**
15
+ * @async
16
+ * @param {string} systemKey
17
+ * @param {Object} options
18
+ * @returns {Promise<Object>}
19
+ */
20
+ async function runGovernanceGenerateForExternalSystem(systemKey, options = {}) {
21
+ const subjects = buildSubjectsFromOptions(options);
22
+ if (subjects.length === 0) {
23
+ throw new Error(
24
+ 'At least one --subject-user-id or --subject-email is required for governance generate'
25
+ );
26
+ }
27
+
28
+ const { resolvedKey, keys, authConfig, dataplaneUrl } =
29
+ await resolveGovernanceIntegrationContext(systemKey, options);
30
+
31
+ const profile = (options.certificationProfile || 'bronze').trim().toLowerCase();
32
+ const maxSamples = Number(options.maxSamplesPerPartition) || 25;
33
+
34
+ const results = await runWithVerifyStepProgress(
35
+ 'Generating governance scenario packs',
36
+ async progress => {
37
+ const rows = [];
38
+ for (let index = 0; index < keys.length; index += 1) {
39
+ const dsKey = keys[index];
40
+ if (typeof progress.setLabel === 'function') {
41
+ progress.setLabel(`Generating pack: ${dsKey} (${index + 1}/${keys.length})`);
42
+ }
43
+ const row = await generateDatasourceGovernancePack(
44
+ dataplaneUrl,
45
+ authConfig,
46
+ dsKey,
47
+ {
48
+ certificationProfile: profile,
49
+ subjects,
50
+ systemKey: resolvedKey,
51
+ maxSamplesPerPartition: maxSamples
52
+ }
53
+ );
54
+ rows.push({ datasourceKey: dsKey, ...row });
55
+ }
56
+ return rows;
57
+ },
58
+ options
59
+ );
60
+
61
+ return {
62
+ systemKey: resolvedKey,
63
+ command: 'governance generate',
64
+ generated: results.length,
65
+ results
66
+ };
67
+ }
68
+
69
+ module.exports = {
70
+ runGovernanceGenerateForExternalSystem
71
+ };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @fileoverview governance upload — push integration/<systemKey>/scenarios/*.yaml (424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const { uploadGovernanceScenarioPacks } = require('../lifecycle/scenario-upload');
8
+ const { resolveGovernanceIntegrationContext } = require('./governance-cli-shared');
9
+
10
+ /**
11
+ * @async
12
+ * @param {string} systemKey
13
+ * @param {Object} options
14
+ * @returns {Promise<Object>}
15
+ */
16
+ async function runGovernanceUploadForExternalSystem(systemKey, options = {}) {
17
+ const { resolvedKey, authConfig, dataplaneUrl } = await resolveGovernanceIntegrationContext(
18
+ systemKey,
19
+ options
20
+ );
21
+ const uploaded = await uploadGovernanceScenarioPacks(
22
+ resolvedKey,
23
+ dataplaneUrl,
24
+ authConfig,
25
+ { silent: options.json === true }
26
+ );
27
+ return {
28
+ systemKey: resolvedKey,
29
+ command: 'governance upload',
30
+ uploaded
31
+ };
32
+ }
33
+
34
+ module.exports = {
35
+ runGovernanceUploadForExternalSystem
36
+ };
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @fileoverview governance verify — run persisted packs (424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const { runVerifyGovernanceFromDbPacks } = require('./verify-governance-db');
8
+ const {
9
+ sumEnforcementScenarios,
10
+ aggregateCoverage,
11
+ buildPackOverrideResult
12
+ } = require('./verify-governance-result-builders');
13
+ const { VERDICT, verdictFromPassed } = require('../lifecycle/product-model');
14
+
15
+ /**
16
+ * @async
17
+ * @param {string} systemKey
18
+ * @param {Object} options
19
+ * @returns {Promise<Object>}
20
+ */
21
+ async function runGovernanceVerifyForExternalSystem(systemKey, options = {}) {
22
+ const pathsUtil = require('../utils/paths');
23
+ const appType = await pathsUtil.detectAppType(systemKey).catch(() => null);
24
+ if (!appType || appType.baseDir !== 'integration') {
25
+ throw new Error(
26
+ 'governance verify applies to external integration folders only (integration/<systemKey>/).'
27
+ );
28
+ }
29
+
30
+ if (options.pack) {
31
+ const { runTestGovernanceForExternalSystem } = require('./test-governance-external');
32
+ const runPayload = await runTestGovernanceForExternalSystem(systemKey, options);
33
+ return buildPackOverrideResult(systemKey, runPayload, 'governance verify');
34
+ }
35
+
36
+ const { resolvedKey, datasourceRows } = await runVerifyGovernanceFromDbPacks(systemKey, options);
37
+ if (datasourceRows.length === 0) {
38
+ return {
39
+ systemKey: resolvedKey,
40
+ command: 'governance verify',
41
+ verdict: VERDICT.FAILED,
42
+ policyCoveragePercent: 0,
43
+ dimensionCoveragePercent: 0,
44
+ enforcementScenarios: { passed: 0, total: 0 },
45
+ datasourceRows: []
46
+ };
47
+ }
48
+
49
+ const allVerified = datasourceRows.every(r => r.verdict === VERDICT.VERIFIED);
50
+ const coverage = aggregateCoverage(datasourceRows);
51
+ return {
52
+ systemKey: resolvedKey,
53
+ command: 'governance verify',
54
+ verdict: verdictFromPassed(allVerified),
55
+ policyCoveragePercent: coverage.policy ?? (allVerified ? 100 : 0),
56
+ dimensionCoveragePercent: coverage.dimension ?? (allVerified ? 100 : 0),
57
+ enforcementScenarios: sumEnforcementScenarios(datasourceRows),
58
+ datasourceRows
59
+ };
60
+ }
61
+
62
+ module.exports = {
63
+ runGovernanceVerifyForExternalSystem
64
+ };
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @fileoverview Integration validation scenario packs — governance command family (424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const {
8
+ collectString,
9
+ governanceGenerateHandler,
10
+ governanceVerifyHandler,
11
+ governanceUploadHandler,
12
+ governanceDownloadHandler
13
+ } = require('./governance-command-action');
14
+ const {
15
+ GOVERNANCE_GENERATE_HELP_AFTER,
16
+ GOVERNANCE_VERIFY_HELP_AFTER,
17
+ GOVERNANCE_UPLOAD_HELP_AFTER,
18
+ GOVERNANCE_DOWNLOAD_HELP_AFTER,
19
+ GOVERNANCE_PARENT_HELP_AFTER
20
+ } = require('../cli/setup-certification.help');
21
+
22
+ const SHARED_OPTS = [
23
+ ['-e, --env <env>', 'Environment: dev, tst, or pro', 'dev'],
24
+ ['--no-sync', 'Skip publishing local integration files before dataplane calls'],
25
+ [
26
+ '--force',
27
+ 'With default sync, pass force to upload (same as aifabrix upload --force)'
28
+ ]
29
+ ];
30
+
31
+ /**
32
+ * @param {import('commander').Command} cmd
33
+ */
34
+ function applySharedGovernanceOpts(cmd) {
35
+ for (const [flags, desc, defaultValue] of SHARED_OPTS) {
36
+ cmd.option(flags, desc, defaultValue);
37
+ }
38
+ }
39
+
40
+ /**
41
+ * @param {import('commander').Command} governance
42
+ */
43
+ function registerGovernanceGenerate(governance) {
44
+ const cmd = governance
45
+ .command('generate <systemKey>')
46
+ .description('Generate integration validation scenario packs on the dataplane')
47
+ .option(
48
+ '--certification-profile <profile>',
49
+ 'Certification profile (bronze, silver, gold, …)',
50
+ 'bronze'
51
+ )
52
+ .option(
53
+ '--subject-user-id <id>',
54
+ 'Subject user id for generated scenarios (repeatable)',
55
+ collectString,
56
+ []
57
+ )
58
+ .option(
59
+ '--subject-email <email>',
60
+ 'Subject email for generated scenarios (repeatable)',
61
+ collectString,
62
+ []
63
+ )
64
+ .option(
65
+ '--max-samples-per-partition <n>',
66
+ 'Max keys per mustInclude/mustExclude partition',
67
+ '25'
68
+ )
69
+ .option('-v, --verbose', 'Verbose output')
70
+ .option('--json', 'Machine-readable envelope')
71
+ .addHelpText('after', GOVERNANCE_GENERATE_HELP_AFTER)
72
+ .action(governanceGenerateHandler);
73
+ applySharedGovernanceOpts(cmd);
74
+ }
75
+
76
+ /**
77
+ * @param {import('commander').Command} governance
78
+ */
79
+ function registerGovernanceVerify(governance) {
80
+ const cmd = governance
81
+ .command('verify <systemKey>')
82
+ .description('Run persisted scenario packs (governance:evaluate)')
83
+ .option(
84
+ '--pack <path>',
85
+ 'Authoring override: local scenario pack YAML instead of dataplane active pack'
86
+ )
87
+ .option('-a, --app <path>', 'Integration folder override (with --pack)')
88
+ .option('--scenario <id>', 'Scenario subset when using --pack (repeatable)', collectString, [])
89
+ .option('-v, --verbose', 'Per-datasource breakdown')
90
+ .option('--json', 'Machine-readable envelope')
91
+ .addHelpText('after', GOVERNANCE_VERIFY_HELP_AFTER)
92
+ .action(governanceVerifyHandler);
93
+ applySharedGovernanceOpts(cmd);
94
+ }
95
+
96
+ /**
97
+ * @param {import('commander').Command} governance
98
+ */
99
+ function registerGovernanceUpload(governance) {
100
+ const cmd = governance
101
+ .command('upload <systemKey>')
102
+ .description('Upload integration/<systemKey>/scenarios/*.yaml to the dataplane')
103
+ .option('--json', 'Machine-readable envelope')
104
+ .addHelpText('after', GOVERNANCE_UPLOAD_HELP_AFTER)
105
+ .action(governanceUploadHandler);
106
+ applySharedGovernanceOpts(cmd);
107
+ }
108
+
109
+ /**
110
+ * @param {import('commander').Command} governance
111
+ */
112
+ function registerGovernanceDownload(governance) {
113
+ const cmd = governance
114
+ .command('download <systemKey>')
115
+ .description('Download active packs to integration/<systemKey>/scenarios/')
116
+ .option('--json', 'Machine-readable envelope')
117
+ .addHelpText('after', GOVERNANCE_DOWNLOAD_HELP_AFTER)
118
+ .action(governanceDownloadHandler);
119
+ applySharedGovernanceOpts(cmd);
120
+ }
121
+
122
+ /**
123
+ * @param {import('commander').Command} program
124
+ */
125
+ function setupGovernanceCommands(program) {
126
+ const governance = program
127
+ .command('governance')
128
+ .description(
129
+ 'Integration validation scenario packs (generate, verify, download, upload)'
130
+ )
131
+ .addHelpText('after', GOVERNANCE_PARENT_HELP_AFTER);
132
+
133
+ applySharedGovernanceOpts(governance);
134
+
135
+ registerGovernanceGenerate(governance);
136
+ registerGovernanceVerify(governance);
137
+ registerGovernanceUpload(governance);
138
+ registerGovernanceDownload(governance);
139
+ }
140
+
141
+ module.exports = {
142
+ setupGovernanceCommands,
143
+ collectString
144
+ };