@aifabrix/builder 2.45.5 → 2.47.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 (355) 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/project-rules.mdc +1 -0
  4. package/.npmrc.token +1 -0
  5. package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
  6. package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
  7. package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
  8. package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
  9. package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
  10. package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
  11. package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
  12. package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
  13. package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
  14. package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
  15. package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
  16. package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
  17. package/.temp/validation/summary.txt +5 -0
  18. package/README.md +43 -17
  19. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  20. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  21. package/jest.config.default.js +2 -1
  22. package/jest.config.isolated.js +2 -1
  23. package/jest.global-live-fabrix-hooks.js +36 -0
  24. package/jest.isolated-projects.js +146 -0
  25. package/jest.projects.js +65 -136
  26. package/lib/api/api-response-errors.js +124 -0
  27. package/lib/api/dataplane-health.api.js +19 -7
  28. package/lib/api/governance-scenario-pack.api.js +159 -0
  29. package/lib/api/index.js +43 -3
  30. package/lib/api/lifecycle.api.js +98 -0
  31. package/lib/api/pipeline.api.js +3 -1
  32. package/lib/api/records-bulk.api.js +14 -1
  33. package/lib/api/resource-types.api.js +107 -0
  34. package/lib/api/runtime-configuration.api.js +72 -0
  35. package/lib/api/types/resource-types.types.js +45 -0
  36. package/lib/api/user-groups.api.js +9 -9
  37. package/lib/api/users.api.js +8 -8
  38. package/lib/api/validation-runner.js +3 -1
  39. package/lib/api/wizard.api.js +10 -2
  40. package/lib/app/deploy-config.js +4 -1
  41. package/lib/app/down.js +78 -27
  42. package/lib/app/index.js +2 -2
  43. package/lib/app/push.js +4 -5
  44. package/lib/app/register.js +7 -4
  45. package/lib/app/run-env-compose.js +84 -30
  46. package/lib/app/run-resolve-image.js +2 -1
  47. package/lib/app/run-stop-containers.js +113 -0
  48. package/lib/app/run.js +1 -31
  49. package/lib/app/show-display.js +35 -0
  50. package/lib/app/show.js +32 -1
  51. package/lib/build/index.js +22 -5
  52. package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
  53. package/lib/certification/sync-system-certification.js +13 -6
  54. package/lib/channels/add-channel.js +348 -0
  55. package/lib/channels/channel-artifact-generator.js +141 -0
  56. package/lib/channels/channel-audit.js +101 -0
  57. package/lib/channels/channel-auth-context.js +37 -0
  58. package/lib/channels/channel-credential.js +200 -0
  59. package/lib/channels/channel-display-name.js +64 -0
  60. package/lib/channels/channel-external-system.js +106 -0
  61. package/lib/channels/channel-integration-generator.js +274 -0
  62. package/lib/channels/channel-probe.js +89 -0
  63. package/lib/channels/channel-runtime-resolver.js +152 -0
  64. package/lib/channels/channel-status-display.js +141 -0
  65. package/lib/channels/channel-targets.js +115 -0
  66. package/lib/cli/index.js +20 -4
  67. package/lib/cli/infra-guided-auth.js +109 -0
  68. package/lib/cli/infra-guided.js +84 -81
  69. package/lib/cli/setup-app.help.js +0 -31
  70. package/lib/cli/setup-app.js +82 -5
  71. package/lib/cli/setup-app.test-commands.js +5 -57
  72. package/lib/cli/setup-auth.js +25 -0
  73. package/lib/cli/setup-certification-commands.js +147 -0
  74. package/lib/cli/setup-certification.help.js +141 -0
  75. package/lib/cli/setup-environment.js +19 -2
  76. package/lib/cli/setup-external-system-help.js +62 -0
  77. package/lib/cli/setup-external-system.js +25 -3
  78. package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
  79. package/lib/cli/setup-infra-up-platform-action.js +2 -1
  80. package/lib/cli/setup-infra.js +9 -1
  81. package/lib/cli/setup-platform.js +6 -1
  82. package/lib/cli/setup-secrets.js +33 -1
  83. package/lib/cli/setup-utility-help-after.js +25 -2
  84. package/lib/cli/setup-utility-repair.js +198 -0
  85. package/lib/cli/setup-utility-resolve.js +44 -5
  86. package/lib/cli/setup-utility-validate.js +197 -0
  87. package/lib/cli/setup-utility.js +4 -239
  88. package/lib/commands/app-logs.js +54 -26
  89. package/lib/commands/app.js +41 -0
  90. package/lib/commands/auth-status-client-tokens.js +214 -0
  91. package/lib/commands/auth-status-dataplane-version.js +142 -68
  92. package/lib/commands/auth-status.js +43 -54
  93. package/lib/commands/channel.js +58 -0
  94. package/lib/commands/datasource-test-trust-cli.js +27 -23
  95. package/lib/commands/datasource-unified-test-cli.js +6 -3
  96. package/lib/commands/datasource-unified-test-cli.options.js +5 -1
  97. package/lib/commands/datasource.js +8 -8
  98. package/lib/commands/dev-show-display.js +8 -1
  99. package/lib/commands/governance-cli-shared.js +94 -0
  100. package/lib/commands/governance-command-action.js +132 -0
  101. package/lib/commands/governance-download-external.js +34 -0
  102. package/lib/commands/governance-generate-external.js +71 -0
  103. package/lib/commands/governance-upload-external.js +36 -0
  104. package/lib/commands/governance-verify-external.js +64 -0
  105. package/lib/commands/governance.js +144 -0
  106. package/lib/commands/identity-apply-sync.js +49 -8
  107. package/lib/commands/identity-group-cli.js +66 -26
  108. package/lib/commands/identity-membership-role-cache.js +58 -37
  109. package/lib/commands/identity-shared.js +22 -1
  110. package/lib/commands/identity-user-cli.js +80 -34
  111. package/lib/commands/lifecycle-command-action.js +123 -0
  112. package/lib/commands/lifecycle-external.js +268 -0
  113. package/lib/commands/login.js +11 -2
  114. package/lib/commands/repair-auth-apply.js +153 -0
  115. package/lib/commands/repair-auth-config.js +8 -13
  116. package/lib/commands/repair-changed-files.js +41 -0
  117. package/lib/commands/repair-datasource-com-v2.js +15 -0
  118. package/lib/commands/repair-datasource-keys.js +4 -1
  119. package/lib/commands/repair-datasource-run.js +59 -0
  120. package/lib/commands/repair-datasource-service-contract.js +206 -0
  121. package/lib/commands/repair-datasource-test-payload.js +259 -0
  122. package/lib/commands/repair-datasource.js +49 -64
  123. package/lib/commands/repair-env-template.js +76 -25
  124. package/lib/commands/repair-external-run.js +216 -0
  125. package/lib/commands/repair-openapi-sync.js +49 -4
  126. package/lib/commands/repair-persist.js +4 -0
  127. package/lib/commands/repair-rbac.js +52 -1
  128. package/lib/commands/repair-steps.js +160 -0
  129. package/lib/commands/repair-system-alignment.js +7 -4
  130. package/lib/commands/repair.js +29 -296
  131. package/lib/commands/resource-type.js +371 -0
  132. package/lib/commands/secrets-get.js +184 -0
  133. package/lib/commands/secrets-remove-all.js +3 -1
  134. package/lib/commands/setup-image-refresh.js +146 -0
  135. package/lib/commands/setup-modes.js +158 -162
  136. package/lib/commands/setup-platform-auth.js +76 -0
  137. package/lib/commands/setup-prompts-admin.js +244 -0
  138. package/lib/commands/setup-prompts-platform-mode.js +70 -0
  139. package/lib/commands/setup-prompts-validators.js +36 -0
  140. package/lib/commands/setup-prompts.js +24 -76
  141. package/lib/commands/setup-run-context.js +45 -0
  142. package/lib/commands/setup-spinners.js +39 -0
  143. package/lib/commands/setup.js +27 -5
  144. package/lib/commands/teardown.js +39 -0
  145. package/lib/commands/test-e2e-external.js +24 -8
  146. package/lib/commands/test-governance-external.js +3 -24
  147. package/lib/commands/test-trust-external.js +48 -100
  148. package/lib/commands/up-common.js +57 -13
  149. package/lib/commands/up-dataplane.js +56 -15
  150. package/lib/commands/upload-publish-context.js +75 -0
  151. package/lib/commands/upload-sidecar-followups.js +89 -0
  152. package/lib/commands/upload.js +113 -110
  153. package/lib/commands/verify-governance-combined-external.js +61 -0
  154. package/lib/commands/verify-governance-command-action.js +64 -0
  155. package/lib/commands/verify-governance-db.js +102 -0
  156. package/lib/commands/verify-governance-external.js +77 -0
  157. package/lib/commands/verify-governance-result-builders.js +71 -0
  158. package/lib/commands/verify-operations-command-action.js +68 -0
  159. package/lib/commands/verify-operations-external.js +268 -0
  160. package/lib/commands/verify-operations-persist.js +75 -0
  161. package/lib/commands/verify-operations-step-plan.js +68 -0
  162. package/lib/commands/verify-operations-steps.js +111 -0
  163. package/lib/commands/verify-trust-command-action.js +73 -0
  164. package/lib/commands/verify-trust-external.js +59 -0
  165. package/lib/commands/wizard-config-normalizer.js +43 -23
  166. package/lib/commands/wizard-core.js +2 -0
  167. package/lib/core/admin-password-generator.js +38 -0
  168. package/lib/core/admin-secrets-bundle.js +111 -0
  169. package/lib/core/admin-secrets-env-overlay.js +62 -0
  170. package/lib/core/admin-secrets.js +32 -4
  171. package/lib/core/config-attach-extensions.js +3 -0
  172. package/lib/core/config-platform-controller.js +44 -0
  173. package/lib/core/config-setup-installation-profile.js +42 -0
  174. package/lib/core/config-setup-platform-mode.js +46 -0
  175. package/lib/core/config.js +46 -36
  176. package/lib/core/secrets-admin-env.js +6 -2
  177. package/lib/core/secrets-ensure.js +4 -0
  178. package/lib/core/secrets-env-content.js +54 -48
  179. package/lib/core/secrets-env-write.js +10 -1
  180. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  181. package/lib/core/setup-installation-profile.js +43 -0
  182. package/lib/core/setup-platform-mode.js +90 -0
  183. package/lib/datasource/agent-trust-debug-log.js +1 -1
  184. package/lib/datasource/agent-trust-run.js +5 -3
  185. package/lib/datasource/audit-evidence-extract-debug.js +30 -18
  186. package/lib/datasource/audit-evidence-extract.js +7 -4
  187. package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
  188. package/lib/datasource/bulk-loader-run-batches.js +15 -3
  189. package/lib/datasource/capability/capability-diff-slice.js +2 -2
  190. package/lib/datasource/capability/capability-manifest.js +254 -0
  191. package/lib/datasource/capability/capability-resolve.js +3 -4
  192. package/lib/datasource/capability/copy-operations.js +5 -3
  193. package/lib/datasource/capability/remove-operations.js +2 -1
  194. package/lib/datasource/capability/run-capability-copy.js +32 -4
  195. package/lib/datasource/capability/run-capability-diff.js +3 -3
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -4
  197. package/lib/datasource/capability/run-capability-edit.js +4 -7
  198. package/lib/datasource/capability/run-capability-relate.js +2 -4
  199. package/lib/datasource/capability/run-capability-remove.js +2 -4
  200. package/lib/datasource/capability/validate-capability-slice.js +2 -1
  201. package/lib/datasource/datasource-identifier.js +2 -1
  202. package/lib/datasource/datasource-load-export-context.js +3 -0
  203. package/lib/datasource/datasource-validate-display.js +1 -1
  204. package/lib/datasource/field-reference-validator.js +24 -3
  205. package/lib/datasource/log-cleaner.js +2 -2
  206. package/lib/datasource/log-viewer.js +8 -8
  207. package/lib/datasource/orphan-profiles-validator.js +98 -0
  208. package/lib/datasource/test-e2e.js +4 -1
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run.js +5 -2
  211. package/lib/datasource/validate.js +41 -23
  212. package/lib/deployment/environment-poll-status.js +138 -0
  213. package/lib/deployment/environment.js +42 -34
  214. package/lib/external-system/download-helpers.js +87 -0
  215. package/lib/external-system/download.js +78 -138
  216. package/lib/external-system/generator.js +1 -55
  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.js +16 -21
  220. package/lib/generator/builders.js +11 -1
  221. package/lib/generator/external-controller-manifest.js +18 -0
  222. package/lib/generator/split.js +3 -1
  223. package/lib/generator/wizard.js +1 -28
  224. package/lib/governance/governance-cli-errors.js +96 -0
  225. package/lib/governance/governance-download-display.js +38 -0
  226. package/lib/governance/governance-run-display.js +215 -25
  227. package/lib/identity/fk-reference.js +65 -0
  228. package/lib/identity/identity-apply-core.js +13 -58
  229. package/lib/identity/identity-apply-phases.js +5 -1
  230. package/lib/identity/identity-display.js +243 -0
  231. package/lib/identity/identity-response-helpers.js +52 -0
  232. package/lib/identity/identity-sync-errors.js +62 -0
  233. package/lib/identity/resolve-user-id.js +129 -0
  234. package/lib/identity/username-default.js +31 -0
  235. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  236. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  237. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  238. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  239. package/lib/infrastructure/helpers.js +23 -129
  240. package/lib/infrastructure/index.js +5 -6
  241. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  242. package/lib/lifecycle/certification-progress.js +231 -0
  243. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  244. package/lib/lifecycle/exit-codes.js +24 -0
  245. package/lib/lifecycle/json-envelope.js +25 -0
  246. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  247. package/lib/lifecycle/logger-quiet.js +29 -0
  248. package/lib/lifecycle/open-api-published.js +59 -0
  249. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  250. package/lib/lifecycle/product-model.js +196 -0
  251. package/lib/lifecycle/report-display-trust.js +70 -0
  252. package/lib/lifecycle/report-display.js +472 -0
  253. package/lib/lifecycle/scenario-upload.js +191 -0
  254. package/lib/lifecycle/verify-step-progress.js +87 -0
  255. package/lib/parameters/infra-kv-discovery.js +27 -2
  256. package/lib/protection/auth-context.js +10 -4
  257. package/lib/resolvers/datasource-resolver.js +2 -3
  258. package/lib/resolvers/resource-type-file.js +159 -0
  259. package/lib/schema/application-schema.json +17 -1
  260. package/lib/schema/datasource-test-run.schema.json +89 -6
  261. package/lib/schema/deployment-rules.yaml +2 -1
  262. package/lib/schema/external-datasource.schema.json +2947 -2619
  263. package/lib/schema/external-system.schema.json +1418 -761
  264. package/lib/schema/infra.parameter.yaml +45 -0
  265. package/lib/schema/type/credential-field-registry.json +103 -97
  266. package/lib/schema/type/document-storage.json +9 -5
  267. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  268. package/lib/utils/api.js +55 -31
  269. package/lib/utils/app-relative-path-env.js +112 -0
  270. package/lib/utils/app-run-containers.js +25 -2
  271. package/lib/utils/authentication-shape.js +224 -0
  272. package/lib/utils/build-copy.js +36 -5
  273. package/lib/utils/build-resolve-image.js +66 -12
  274. package/lib/utils/celery-companion-apps.js +53 -0
  275. package/lib/utils/cli-secrets-error-format.js +83 -21
  276. package/lib/utils/cli-utils.js +20 -4
  277. package/lib/utils/compose-celery-worker.js +23 -0
  278. package/lib/utils/compose-generate-docker-compose.js +13 -1
  279. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  280. package/lib/utils/config-secrets-path.js +46 -0
  281. package/lib/utils/configuration-env-resolver.js +36 -0
  282. package/lib/utils/controller-url.js +88 -1
  283. package/lib/utils/credential-secrets-env-kv.js +216 -0
  284. package/lib/utils/credential-secrets-env.js +175 -257
  285. package/lib/utils/dataplane-resolver.js +18 -2
  286. package/lib/utils/declarative-url-ports.js +27 -4
  287. package/lib/utils/deployment-auth-mode.js +41 -0
  288. package/lib/utils/developer-volume-id.js +33 -0
  289. package/lib/utils/docker-build.js +1 -4
  290. package/lib/utils/env-copy.js +14 -9
  291. package/lib/utils/env-kv-orphan-lines.js +43 -0
  292. package/lib/utils/error-formatters/network-errors.js +13 -4
  293. package/lib/utils/external-env-template.js +11 -3
  294. package/lib/utils/external-system-readiness-core.js +10 -0
  295. package/lib/utils/external-system-readiness-display.js +80 -23
  296. package/lib/utils/external-system-validators.js +8 -2
  297. package/lib/utils/health-check.js +4 -1
  298. package/lib/utils/help-builder.js +13 -8
  299. package/lib/utils/keycloak-realm-ready.js +101 -0
  300. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  301. package/lib/utils/manifest-source-emit.js +2 -0
  302. package/lib/utils/paths.js +25 -0
  303. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  304. package/lib/utils/platform-controller-url.js +157 -0
  305. package/lib/utils/platform-kv-ref.js +57 -0
  306. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  307. package/lib/utils/postgres-wipe.js +9 -2
  308. package/lib/utils/resolve-env-mode.js +47 -0
  309. package/lib/utils/runtime-configuration-download.js +189 -0
  310. package/lib/utils/runtime-configuration-values.js +119 -0
  311. package/lib/utils/schema-loader.js +19 -4
  312. package/lib/utils/secrets-generator.js +31 -25
  313. package/lib/utils/secrets-missing-error.js +164 -0
  314. package/lib/utils/service-url-label.js +81 -0
  315. package/lib/utils/setup-quiet-output.js +25 -0
  316. package/lib/utils/template-helpers.js +15 -0
  317. package/lib/utils/token-manager-client-credentials.js +201 -0
  318. package/lib/utils/token-manager-messages.js +8 -0
  319. package/lib/utils/token-manager-refresh.js +12 -2
  320. package/lib/utils/token-manager.js +86 -105
  321. package/lib/utils/upload-pipeline-ui.js +12 -5
  322. package/lib/utils/upload-sync-options.js +42 -0
  323. package/lib/utils/url-declarative-public-base.js +21 -3
  324. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  325. package/lib/utils/validation-poll-ui.js +8 -0
  326. package/lib/utils/validation-run-stage.js +45 -0
  327. package/lib/utils/worker-sidecars.js +142 -0
  328. package/lib/validation/external-manifest-validator.js +2 -0
  329. package/lib/validation/runtime-configuration-rules.js +98 -0
  330. package/lib/validation/validate-display-dimensions.js +154 -0
  331. package/lib/validation/validate-display-sections.js +276 -0
  332. package/lib/validation/validate-display-steps.js +67 -0
  333. package/lib/validation/validate-display.js +24 -402
  334. package/package.json +1 -1
  335. package/templates/applications/dataplane/application.yaml +7 -1
  336. package/templates/applications/dataplane/env.template +50 -14
  337. package/templates/applications/dataplane/rbac.yaml +108 -1
  338. package/templates/applications/miso-controller/application.yaml +2 -2
  339. package/templates/applications/miso-controller/env.template +53 -122
  340. package/templates/applications/miso-controller/rbac.yaml +28 -13
  341. package/templates/channels/chatgpt/install.template.md.hbs +49 -0
  342. package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
  343. package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
  344. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
  345. package/templates/channels/slack/install.template.md.hbs +49 -0
  346. package/templates/channels/slack/manifest.template.json.hbs +66 -0
  347. package/templates/channels/teams-bot/install.template.md.hbs +49 -0
  348. package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
  349. package/templates/channels/web-embed/install.template.md.hbs +49 -0
  350. package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
  351. package/templates/external-system/README.md.hbs +74 -17
  352. package/templates/python/docker-compose.hbs +75 -18
  353. package/templates/typescript/docker-compose.hbs +70 -17
  354. package/lib/commands/test-governance-command-action.js +0 -55
  355. package/lib/commands/test-trust-command-action.js +0 -118
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @fileoverview CLI action for `aifabrix verify-governance` (plan 150.0 / 424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const logger = require('../utils/logger');
8
+ const { handleCommandError } = require('../utils/cli-utils');
9
+ const { runVerifyGovernanceCombined } = require('./verify-governance-combined-external');
10
+ const { normalizeTestGovernanceCliOptions } = require('./test-governance-cli-options');
11
+ const { displayVerifyGovernanceTTY } = require('../lifecycle/report-display');
12
+ const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
13
+ const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
14
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
15
+
16
+ /**
17
+ * @param {Object} options
18
+ * @param {import('commander').Command} [cmd]
19
+ * @returns {Object}
20
+ */
21
+ function normalizeVerifyGovernanceCliOptions(options, cmd) {
22
+ const base = normalizeTestGovernanceCliOptions(options, cmd);
23
+ return {
24
+ ...base,
25
+ certificationProfile: options.certificationProfile || 'bronze',
26
+ subjectUserIds: options.subjectUserId || [],
27
+ subjectEmails: options.subjectEmail || [],
28
+ maxSamplesPerPartition: options.maxSamplesPerPartition
29
+ };
30
+ }
31
+
32
+ async function runVerifyGovernanceCommandAction(appName, options, cmd) {
33
+ const opts = normalizeVerifyGovernanceCliOptions(options, cmd);
34
+ const result = await runVerifyGovernanceCombined(appName, opts);
35
+
36
+ if (opts.json) {
37
+ logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
38
+ } else {
39
+ if (opts.verbose && !opts.pack && typeof result.generated === 'number' && result.generated > 0) {
40
+ logger.log(formatSuccessLine(`Generated packs for ${result.generated} datasource(s)`));
41
+ }
42
+ displayVerifyGovernanceTTY(result.systemKey, result, { details: opts.verbose });
43
+ }
44
+
45
+ const exitCode = exitCodeFromVerdict(result.verdict);
46
+ if (exitCode !== 0) {
47
+ process.exit(exitCode);
48
+ }
49
+ }
50
+
51
+ async function verifyGovernanceCommandHandler(appName, options, cmd) {
52
+ try {
53
+ await runVerifyGovernanceCommandAction(appName, options, cmd);
54
+ } catch (error) {
55
+ handleCommandError(error, 'verify-governance');
56
+ process.exit(3);
57
+ }
58
+ }
59
+
60
+ module.exports = {
61
+ runVerifyGovernanceCommandAction,
62
+ verifyGovernanceCommandHandler,
63
+ normalizeVerifyGovernanceCliOptions
64
+ };
@@ -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
+ };