@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,102 @@
1
+ /**
2
+ * @fileoverview verify-governance DB pack path (plan 150.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const {
8
+ resolveExternalIntegrationContext,
9
+ syncLocalIfRequested
10
+ } = require('./test-e2e-external');
11
+ const { runDatasourceGovernanceScenarios, getDatasourceGovernancePack } = require('../api/governance-scenario-pack.api');
12
+ const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
13
+ const { cliOptsSkipSync } = require('../utils/cli-sync-options');
14
+ const { VERDICT } = require('../lifecycle/product-model');
15
+ const { runWithVerifyStepProgress } = require('../lifecycle/verify-step-progress');
16
+
17
+ /**
18
+ * @param {Object} options
19
+ * @param {Object|null} uploadCtx
20
+ */
21
+ function attachUploadAuthToOptions(options, uploadCtx) {
22
+ if (!uploadCtx?.authConfig || !uploadCtx?.dataplaneUrl) {
23
+ return;
24
+ }
25
+ options.authConfig = uploadCtx.authConfig;
26
+ options.dataplaneUrl = uploadCtx.dataplaneUrl;
27
+ options.silentResolve = true;
28
+ }
29
+
30
+ /**
31
+ * @async
32
+ * @param {string[]} keys
33
+ * @param {Object} ctx
34
+ * @param {{ setLabel?: (label: string) => void }} [progress]
35
+ * @returns {Promise<Array>}
36
+ */
37
+ async function runGovernanceForDatasourceKeys(keys, ctx, progress = {}) {
38
+ const rows = [];
39
+ for (let index = 0; index < keys.length; index += 1) {
40
+ const key = keys[index];
41
+ if (typeof progress.setLabel === 'function') {
42
+ progress.setLabel(`Running governance scenarios: ${key} (${index + 1}/${keys.length})`);
43
+ }
44
+ try {
45
+ const packRow = await getDatasourceGovernancePack(ctx.dataplaneUrl, ctx.authConfig, key);
46
+ if (!packRow || !packRow.pack) {
47
+ continue;
48
+ }
49
+ const result = await runDatasourceGovernanceScenarios(ctx.dataplaneUrl, ctx.authConfig, key);
50
+ const summary = result.summary || {};
51
+ rows.push({
52
+ datasourceKey: key,
53
+ verdict: summary.failed > 0 ? VERDICT.FAILED : VERDICT.VERIFIED,
54
+ scenarios: { passed: summary.passed || 0, total: summary.total || 0 },
55
+ policyCoveragePercent: result.policyCoveragePercent ?? 100,
56
+ dimensionCoveragePercent: result.dimensionCoveragePercent ?? 100,
57
+ packDocument: packRow.pack,
58
+ result
59
+ });
60
+ } catch (err) {
61
+ rows.push({
62
+ datasourceKey: key,
63
+ verdict: VERDICT.FAILED,
64
+ error: err.message,
65
+ scenarios: { passed: 0, total: 0 }
66
+ });
67
+ }
68
+ }
69
+ return rows;
70
+ }
71
+
72
+ /**
73
+ * @async
74
+ * @param {string} systemKey
75
+ * @param {Object} options
76
+ * @returns {Promise<Object>}
77
+ */
78
+ async function runVerifyGovernanceFromDbPacks(systemKey, options) {
79
+ const { systemKey: resolvedKey, keys } = resolveExternalIntegrationContext(systemKey);
80
+ if (keys.length === 0) {
81
+ return { resolvedKey, datasourceRows: [] };
82
+ }
83
+
84
+ if (!cliOptsSkipSync(options)) {
85
+ const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
86
+ attachUploadAuthToOptions(options, uploadCtx);
87
+ }
88
+
89
+ const { authConfig, dataplaneUrl } = await resolveIntegrationAuth(resolvedKey, options);
90
+ const datasourceRows = await runWithVerifyStepProgress(
91
+ 'Running governance scenarios',
92
+ async(progress) =>
93
+ runGovernanceForDatasourceKeys(keys, { authConfig, dataplaneUrl }, progress),
94
+ options
95
+ );
96
+ return { resolvedKey, datasourceRows };
97
+ }
98
+
99
+ module.exports = {
100
+ runGovernanceForDatasourceKeys,
101
+ runVerifyGovernanceFromDbPacks
102
+ };
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @fileoverview verify-governance orchestration — DB scenario packs per datasource (plan 150.0).
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { runTestGovernanceForExternalSystem } = require('./test-governance-external');
10
+ const { runVerifyGovernanceFromDbPacks } = require('./verify-governance-db');
11
+ const { VERDICT, verdictFromPassed } = require('../lifecycle/product-model');
12
+ const {
13
+ sumEnforcementScenarios,
14
+ aggregateCoverage,
15
+ buildPackOverrideResult
16
+ } = require('./verify-governance-result-builders');
17
+
18
+ /**
19
+ * @param {Array<Object>} rows
20
+ * @returns {{ passed: number, total: number }}
21
+ */
22
+ function buildDbPackResult(resolvedKey, datasourceRows) {
23
+ const allVerified = datasourceRows.every(r => r.verdict === VERDICT.VERIFIED);
24
+ const coverage = aggregateCoverage(datasourceRows);
25
+ return {
26
+ systemKey: resolvedKey,
27
+ command: 'verify-governance',
28
+ verdict: verdictFromPassed(allVerified),
29
+ policyCoveragePercent: coverage.policy ?? (allVerified ? 100 : 0),
30
+ dimensionCoveragePercent: coverage.dimension ?? (allVerified ? 100 : 0),
31
+ enforcementScenarios: sumEnforcementScenarios(datasourceRows),
32
+ datasourceRows
33
+ };
34
+ }
35
+
36
+ /**
37
+ * @async
38
+ * @param {string} systemKey
39
+ * @param {Object} options
40
+ * @returns {Promise<Object>}
41
+ */
42
+ async function runVerifyGovernanceForExternalSystem(systemKey, options = {}) {
43
+ const pathsUtil = require('../utils/paths');
44
+ const appType = await pathsUtil.detectAppType(systemKey).catch(() => null);
45
+ if (!appType || appType.baseDir !== 'integration') {
46
+ throw new Error(
47
+ 'verify-governance applies to external integration folders only (integration/<systemKey>/).'
48
+ );
49
+ }
50
+
51
+ if (options.pack) {
52
+ const runPayload = await runTestGovernanceForExternalSystem(systemKey, options);
53
+ return buildPackOverrideResult(systemKey, runPayload);
54
+ }
55
+
56
+ const { resolvedKey, datasourceRows } = await runVerifyGovernanceFromDbPacks(systemKey, options);
57
+ if (datasourceRows.length === 0) {
58
+ return {
59
+ systemKey: resolvedKey,
60
+ command: 'verify-governance',
61
+ verdict: VERDICT.FAILED,
62
+ policyCoveragePercent: 0,
63
+ dimensionCoveragePercent: 0,
64
+ enforcementScenarios: { passed: 0, total: 0 },
65
+ datasourceRows: []
66
+ };
67
+ }
68
+
69
+ return buildDbPackResult(resolvedKey, datasourceRows);
70
+ }
71
+
72
+ module.exports = {
73
+ runVerifyGovernanceForExternalSystem,
74
+ buildPackOverrideResult,
75
+ sumEnforcementScenarios,
76
+ aggregateCoverage
77
+ };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @fileoverview Shared verify-governance result builders (breaks governance-verify circular require).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const { verdictFromPassed } = require('../lifecycle/product-model');
8
+ const { primaryDatasourceFromPack } = require('../governance/governance-run-display');
9
+
10
+ /**
11
+ * @param {Array<Object>} rows
12
+ * @returns {{ passed: number, total: number }}
13
+ */
14
+ function sumEnforcementScenarios(rows) {
15
+ let passed = 0;
16
+ let total = 0;
17
+ for (const row of rows) {
18
+ if (row.scenarios) {
19
+ passed += row.scenarios.passed || 0;
20
+ total += row.scenarios.total || 0;
21
+ }
22
+ }
23
+ return { passed, total };
24
+ }
25
+
26
+ /**
27
+ * @param {Array<Object>} rows
28
+ * @returns {{ policy: number|null, dimension: number|null }}
29
+ */
30
+ function aggregateCoverage(rows) {
31
+ const policyVals = rows.map(r => r.policyCoveragePercent).filter(v => typeof v === 'number');
32
+ const dimVals = rows.map(r => r.dimensionCoveragePercent).filter(v => typeof v === 'number');
33
+ const minOr100 = vals => (vals.length === 0 ? null : Math.min(...vals));
34
+ return {
35
+ policy: minOr100(policyVals),
36
+ dimension: minOr100(dimVals)
37
+ };
38
+ }
39
+
40
+ /**
41
+ * @param {string} systemKey
42
+ * @param {{ result: Object, packPath: string, packDocument?: Object }} runPayload
43
+ * @param {string} [commandName]
44
+ * @returns {Object}
45
+ */
46
+ function buildPackOverrideResult(systemKey, runPayload, commandName = 'verify-governance') {
47
+ const { result, packPath, packDocument } = runPayload;
48
+ const summary = result.summary || {};
49
+ return {
50
+ systemKey,
51
+ command: commandName,
52
+ verdict: verdictFromPassed(summary.failed === 0),
53
+ policyCoveragePercent: 100,
54
+ dimensionCoveragePercent: 100,
55
+ enforcementScenarios: {
56
+ passed: summary.passed || 0,
57
+ total: summary.total || 0
58
+ },
59
+ packPath,
60
+ packDocument,
61
+ packDatasourceKey: primaryDatasourceFromPack(packDocument),
62
+ legacyResult: result,
63
+ datasourceRows: []
64
+ };
65
+ }
66
+
67
+ module.exports = {
68
+ sumEnforcementScenarios,
69
+ aggregateCoverage,
70
+ buildPackOverrideResult
71
+ };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @fileoverview CLI action for `aifabrix verify-operations` (plan 150.0).
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const logger = require('../utils/logger');
10
+ const { handleCommandError } = require('../utils/cli-utils');
11
+ const { cliOptsSkipSync } = require('../utils/cli-sync-options');
12
+ const { runVerifyOperationsForExternalSystem } = require('./verify-operations-external');
13
+ const { displayVerifyOperationsTTY } = require('../lifecycle/report-display');
14
+ const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
15
+ const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
16
+
17
+ /**
18
+ * @param {Object} options
19
+ * @param {import('commander').Command} [cmd]
20
+ * @returns {Object}
21
+ */
22
+ function normalizeVerifyOperationsCliOptions(options, cmd) {
23
+ const raw = cmd && Array.isArray(cmd.rawArgs) ? cmd.rawArgs : [];
24
+ const has = flag => raw.includes(flag);
25
+ return {
26
+ env: options.env || 'dev',
27
+ verbose: options.verbose === true || has('-v') || has('--verbose'),
28
+ debug: options.debug === true || has('-d') || has('--debug'),
29
+ json: options.json === true || has('--json'),
30
+ noSync: cliOptsSkipSync(options, cmd),
31
+ continue: options.continue === true || has('--continue'),
32
+ async: options.async !== false
33
+ };
34
+ }
35
+
36
+ async function runVerifyOperationsCommandAction(appName, options, cmd) {
37
+ const opts = normalizeVerifyOperationsCliOptions(options, cmd);
38
+ const result = await runVerifyOperationsForExternalSystem(appName, opts);
39
+
40
+ if (opts.json) {
41
+ logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
42
+ } else {
43
+ displayVerifyOperationsTTY(appName, result, {
44
+ details: opts.verbose,
45
+ warnings: result.warnings
46
+ });
47
+ }
48
+
49
+ const exitCode = exitCodeFromVerdict(result.verdict);
50
+ if (exitCode !== 0) {
51
+ process.exit(exitCode);
52
+ }
53
+ }
54
+
55
+ async function verifyOperationsCommandHandler(appName, options, cmd) {
56
+ try {
57
+ await runVerifyOperationsCommandAction(appName, options, cmd);
58
+ } catch (error) {
59
+ handleCommandError(error, 'verify-operations');
60
+ process.exit(3);
61
+ }
62
+ }
63
+
64
+ module.exports = {
65
+ normalizeVerifyOperationsCliOptions,
66
+ runVerifyOperationsCommandAction,
67
+ verifyOperationsCommandHandler
68
+ };
@@ -0,0 +1,268 @@
1
+ /**
2
+ * @fileoverview verify-operations orchestration for external systems (plan 150.0).
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { runOperationsVerifySteps } = require('./verify-operations-steps');
10
+ const { persistOperationsForSystem } = require('./verify-operations-persist');
11
+ const {
12
+ VERDICT,
13
+ WARNING_CODES,
14
+ actionHint,
15
+ verdictFromPassed,
16
+ computeOperationalReadinessPercent,
17
+ buildOperationsChecksFromSteps
18
+ } = require('../lifecycle/product-model');
19
+ const { getSystemLifecycleReport } = require('../api/lifecycle.api');
20
+ const {
21
+ extractReadinessMetricsFromLifecycleReport
22
+ } = require('../lifecycle/operations-readiness-metrics');
23
+ const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
24
+ const { runWithVerifyStepProgress } = require('../lifecycle/verify-step-progress');
25
+
26
+ /**
27
+ * Build grouped details for verbose (-v) output.
28
+ * @param {Record<string, boolean>} checks
29
+ * @returns {Object}
30
+ */
31
+ function groupOperationsDetails(checks) {
32
+ return {
33
+ connectivity: {
34
+ credentials: checks.credentials,
35
+ authentication: checks.authentication,
36
+ authorization: checks.authorization
37
+ },
38
+ contracts: {
39
+ openApi: checks.openApi,
40
+ mappings: checks.mappings
41
+ },
42
+ runtime: {
43
+ sync: checks.sync,
44
+ crud: checks.crud,
45
+ execution: checks.execution
46
+ },
47
+ reliability: {
48
+ validation: checks.validation,
49
+ unitTests: checks.unitTests,
50
+ integrationTests: checks.integrationTests,
51
+ e2eTests: checks.e2eTests
52
+ }
53
+ };
54
+ }
55
+
56
+ /**
57
+ * @param {string} systemKey
58
+ * @param {Object} authConfig
59
+ * @param {string} dataplaneUrl
60
+ * @returns {Promise<Array>}
61
+ */
62
+ async function fetchCrossPillarWarnings(systemKey, authConfig, dataplaneUrl) {
63
+ try {
64
+ const report = await getSystemLifecycleReport(dataplaneUrl, authConfig, systemKey, {
65
+ summary: true
66
+ });
67
+ const warnings = [];
68
+ if (report.trust?.verdict !== VERDICT.VERIFIED) {
69
+ warnings.push({
70
+ code: WARNING_CODES.TRUST_NOT_VERIFIED,
71
+ message: 'AI trust not verified',
72
+ action: actionHint(systemKey, 'verify-trust'),
73
+ suggestedCommand: 'verify-trust'
74
+ });
75
+ }
76
+ if (report.governance?.verdict !== VERDICT.VERIFIED) {
77
+ warnings.push({
78
+ code: WARNING_CODES.GOVERNANCE_NOT_VERIFIED,
79
+ message: 'Governance not verified',
80
+ action: actionHint(systemKey, 'governance verify'),
81
+ suggestedCommand: 'governance verify'
82
+ });
83
+ }
84
+ return warnings;
85
+ } catch {
86
+ return [];
87
+ }
88
+ }
89
+
90
+ /**
91
+ * @param {Object} params
92
+ * @param {string} params.systemKey
93
+ * @param {Object} params.stepResults
94
+ * @param {Record<string, boolean>} params.checks
95
+ * @param {boolean} params.hardFailure
96
+ * @param {Object} params.options
97
+ * @param {number|null} [params.persistedReadinessPercent]
98
+ * @param {Object|null} [params.readinessMetrics]
99
+ */
100
+ async function buildOperationsResult({
101
+ systemKey,
102
+ stepResults,
103
+ checks,
104
+ hardFailure,
105
+ options,
106
+ persistedReadinessPercent = null,
107
+ persistedOperationsVerdict = null,
108
+ readinessMetrics = null,
109
+ lifecycleCertification = null
110
+ }) {
111
+ const localPercent = computeOperationalReadinessPercent(checks);
112
+ const localVerdict = verdictFromPassed(!hardFailure);
113
+ // When CLI E2E (or post-sync steps) failed, show step-derived readiness — persisted
114
+ // slices can report 100% ICC/PDS/DTS while runtime verdict is FAILED (422.0-v1).
115
+ const operationalReadinessPercent = hardFailure
116
+ ? localPercent
117
+ : typeof persistedReadinessPercent === 'number'
118
+ ? persistedReadinessPercent
119
+ : localPercent;
120
+ const verdict = hardFailure
121
+ ? localVerdict
122
+ : typeof persistedOperationsVerdict === 'string' && persistedOperationsVerdict.trim()
123
+ ? persistedOperationsVerdict.trim()
124
+ : localVerdict;
125
+ const details = groupOperationsDetails(checks);
126
+
127
+ let warnings = [];
128
+ try {
129
+ const { authConfig, dataplaneUrl } = await resolveIntegrationAuth(systemKey, options);
130
+ warnings = await fetchCrossPillarWarnings(systemKey, authConfig, dataplaneUrl);
131
+ } catch {
132
+ warnings = [];
133
+ }
134
+
135
+ const certification =
136
+ lifecycleCertification && lifecycleCertification.level
137
+ ? {
138
+ level: lifecycleCertification.level,
139
+ status: lifecycleCertification.status || 'NOT_CERTIFIED'
140
+ }
141
+ : {
142
+ level: verdict === VERDICT.VERIFIED ? 'BRONZE' : 'NONE',
143
+ status: verdict === VERDICT.VERIFIED ? 'TECHNICALLY_READY' : 'NOT_CERTIFIED'
144
+ };
145
+
146
+ return {
147
+ systemKey,
148
+ command: 'verify-operations',
149
+ verdict,
150
+ operationalReadinessPercent,
151
+ readinessMetrics: readinessMetrics || null,
152
+ certification,
153
+ warnings,
154
+ details,
155
+ stepResults
156
+ };
157
+ }
158
+
159
+ /**
160
+ * @param {string} systemKey
161
+ * @returns {Promise<void>}
162
+ */
163
+ async function assertIntegrationExternalSystem(systemKey) {
164
+ const pathsUtil = require('../utils/paths');
165
+ const appType = await pathsUtil.detectAppType(systemKey).catch(() => null);
166
+ if (!appType || appType.baseDir !== 'integration') {
167
+ throw new Error(
168
+ 'verify-operations applies to external integration folders only (integration/<systemKey>/).'
169
+ );
170
+ }
171
+ }
172
+
173
+ /**
174
+ * @param {string} systemKey
175
+ * @param {Object} options
176
+ * @param {Object} stepResults
177
+ * @param {boolean} hardFailure
178
+ * @returns {Promise<Object>}
179
+ */
180
+ async function loadPersistedOperationsMetrics(
181
+ systemKey,
182
+ options,
183
+ stepResults,
184
+ hardFailure,
185
+ stoppedEarly
186
+ ) {
187
+ const empty = {
188
+ persistedReadinessPercent: null,
189
+ persistedOperationsVerdict: null,
190
+ readinessMetrics: null,
191
+ lifecycleCertification: null
192
+ };
193
+ if (options.persist === false) {
194
+ return empty;
195
+ }
196
+ // Persist after upload/sync when integration or E2E ran — partial evidence for Overview (425.9).
197
+ // Skip only when we stopped before post-sync steps (validate/unit hard fail without --continue).
198
+ if (stoppedEarly) {
199
+ return empty;
200
+ }
201
+
202
+ return runWithVerifyStepProgress(
203
+ 'Saving operations results',
204
+ async() => {
205
+ await persistOperationsForSystem(systemKey, options, stepResults);
206
+ try {
207
+ const { authConfig, dataplaneUrl } = await resolveIntegrationAuth(systemKey, options);
208
+ const report = await getSystemLifecycleReport(dataplaneUrl, authConfig, systemKey, {
209
+ details: true
210
+ });
211
+ return {
212
+ persistedReadinessPercent:
213
+ typeof report?.operations?.operationalReadinessPercent === 'number'
214
+ ? report.operations.operationalReadinessPercent
215
+ : null,
216
+ persistedOperationsVerdict:
217
+ typeof report?.operations?.verdict === 'string' ? report.operations.verdict : null,
218
+ readinessMetrics: extractReadinessMetricsFromLifecycleReport(report),
219
+ lifecycleCertification: report?.certification || null
220
+ };
221
+ } catch {
222
+ return empty;
223
+ }
224
+ },
225
+ options
226
+ );
227
+ }
228
+
229
+ /**
230
+ * @async
231
+ * @param {string} systemKey
232
+ * @param {Object} options
233
+ * @returns {Promise<Object>}
234
+ */
235
+ async function runVerifyOperationsForExternalSystem(systemKey, options = {}) {
236
+ await assertIntegrationExternalSystem(systemKey);
237
+
238
+ const { stepResults, hardFailure, stoppedEarly } = await runOperationsVerifySteps(
239
+ systemKey,
240
+ options
241
+ );
242
+ const checks = buildOperationsChecksFromSteps(stepResults);
243
+ const persisted = await loadPersistedOperationsMetrics(
244
+ systemKey,
245
+ options,
246
+ stepResults,
247
+ hardFailure,
248
+ stoppedEarly
249
+ );
250
+
251
+ return buildOperationsResult({
252
+ systemKey,
253
+ stepResults,
254
+ checks,
255
+ hardFailure,
256
+ options,
257
+ ...persisted
258
+ });
259
+ }
260
+
261
+ module.exports = {
262
+ runVerifyOperationsForExternalSystem,
263
+ groupOperationsDetails,
264
+ fetchCrossPillarWarnings,
265
+ buildOperationsResult,
266
+ assertIntegrationExternalSystem,
267
+ loadPersistedOperationsMetrics
268
+ };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @fileoverview Persist operations pillar to dataplane lifecycle (plan 150.0 / 419.0).
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { resolveExternalIntegrationContext } = require('./test-e2e-external');
10
+ const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
11
+ const { postValidationRun } = require('../api/validation-run.api');
12
+ const { buildExternalDataSourceValidationRequest } = require('../utils/validation-run-request');
13
+
14
+ /**
15
+ * Optional unit rollup stored in operations.details.reliability.unit.
16
+ * @param {Object} stepResults
17
+ * @returns {Object|undefined}
18
+ */
19
+ function buildUnitTestSummary(stepResults) {
20
+ if (!stepResults || stepResults.unit !== true) {
21
+ return undefined;
22
+ }
23
+ return { passed: 1, failed: 0, skipped: 0 };
24
+ }
25
+
26
+ /**
27
+ * POST validation/run runType=operations for each active datasource (persists resultOperations).
28
+ * @async
29
+ * @param {string} systemKey
30
+ * @param {Object} options
31
+ * @param {Object} stepResults
32
+ * @returns {Promise<{ persisted: number }>}
33
+ */
34
+ async function persistOperationsForSystem(systemKey, options, stepResults) {
35
+ const { systemKey: resolvedKey, keys } = resolveExternalIntegrationContext(systemKey);
36
+ if (keys.length === 0) {
37
+ return { persisted: 0 };
38
+ }
39
+
40
+ const { authConfig, dataplaneUrl } = await resolveIntegrationAuth(systemKey, options);
41
+
42
+ const timeoutMs = parseInt(String(options.timeout || '120000'), 10) || 120000;
43
+ const unitTestSummary = buildUnitTestSummary(stepResults);
44
+ let persisted = 0;
45
+
46
+ for (const dsKey of keys) {
47
+ const body = buildExternalDataSourceValidationRequest({
48
+ systemKey: resolvedKey,
49
+ datasourceKey: dsKey,
50
+ runType: 'operations'
51
+ });
52
+ if (unitTestSummary) {
53
+ body.unitTestSummary = unitTestSummary;
54
+ }
55
+
56
+ const res = await postValidationRun(dataplaneUrl, authConfig, body, { timeoutMs });
57
+ if (!res || res.success === false) {
58
+ const msg =
59
+ (res &&
60
+ res.error &&
61
+ (res.error.formattedError || res.error.error || res.error.message)) ||
62
+ res?.formattedError ||
63
+ 'Operations lifecycle persist failed';
64
+ throw new Error(`${dsKey}: ${msg}`);
65
+ }
66
+ persisted += 1;
67
+ }
68
+
69
+ return { persisted };
70
+ }
71
+
72
+ module.exports = {
73
+ persistOperationsForSystem,
74
+ buildUnitTestSummary
75
+ };