@aifabrix/builder 2.49.2 → 2.51.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 (459) hide show
  1. package/.cursor/plans/157.1-security-quality-violations-by-type.csv +374 -0
  2. package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
  3. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  4. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  5. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  6. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  7. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  8. package/.cursor/skills/README.md +1 -0
  9. package/.dockerignore +52 -0
  10. package/.eslintignore +22 -0
  11. package/README.md +2 -0
  12. package/bin/builder-api-cleanup.js +26 -0
  13. package/bin/builder-api-nest.js +10 -0
  14. package/bin/builder-api-spike.js +19 -0
  15. package/enterprise-knowledge/README.md +50 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  21. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  22. package/integration/README.md +81 -0
  23. package/integration/github/README.md +53 -0
  24. package/integration/github/application.json +21 -0
  25. package/integration/github/deploy.js +72 -0
  26. package/integration/github/env.template +11 -0
  27. package/integration/github/github-datasource-issue-comments.json +239 -0
  28. package/integration/github/github-datasource-issues.json +399 -0
  29. package/integration/github/github-datasource-repository.json +354 -0
  30. package/integration/github/github-deploy.json +1202 -0
  31. package/integration/github/github-system.json +82 -0
  32. package/integration/hubspot-test/README.md +1 -1
  33. package/integration/hubspot-test/create-hubspot.js +1 -16
  34. package/jest.isolated-projects.js +31 -1
  35. package/jest.projects.js +87 -1
  36. package/lib/api/dev-server-https.js +1 -1
  37. package/lib/api/enterprise-knowledge.api.js +63 -0
  38. package/lib/api/evidence-kinds.api.js +128 -0
  39. package/lib/api/evidence.api.js +172 -0
  40. package/lib/api/external-systems.api.js +8 -2
  41. package/lib/api/pipeline.api.js +5 -1
  42. package/lib/api/resource-types.api.js +5 -4
  43. package/lib/api/roles.api.js +121 -0
  44. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  45. package/lib/api/types/evidence-kinds.types.js +42 -0
  46. package/lib/api/types/evidence.types.js +67 -0
  47. package/lib/api/types/resource-types.types.js +2 -0
  48. package/lib/api/types/roles.types.js +36 -0
  49. package/lib/app/certification-verify-rows.js +1 -1
  50. package/lib/app/controller-application-filter.js +36 -0
  51. package/lib/app/deploy.js +1 -1
  52. package/lib/app/list-external-systems.js +130 -0
  53. package/lib/app/list.js +20 -8
  54. package/lib/app/run.js +3 -1
  55. package/lib/app/show-display.js +8 -3
  56. package/lib/app/show-online.js +178 -0
  57. package/lib/app/show.js +39 -90
  58. package/lib/build/builder-api-docker-staging.js +47 -0
  59. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  60. package/lib/build/standard-docker-build.js +2 -0
  61. package/lib/certification/merge-certification-from-artifact.js +1 -1
  62. package/lib/certification/post-unified-cert-sync.js +4 -31
  63. package/lib/certification/sync-after-external-command.js +0 -1
  64. package/lib/certification/sync-system-certification.js +0 -3
  65. package/lib/channels/add-channel.js +40 -34
  66. package/lib/channels/approval-guides/chatgpt.js +33 -0
  67. package/lib/channels/approval-guides/credential-portal.js +38 -0
  68. package/lib/channels/approval-guides/index.js +110 -0
  69. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  70. package/lib/channels/approval-guides/slack.js +34 -0
  71. package/lib/channels/approval-guides/teams-bot.js +35 -0
  72. package/lib/channels/approval-guides/web-embed.js +32 -0
  73. package/lib/channels/channel-approval-guide.js +11 -0
  74. package/lib/channels/channel-artifact-generator.js +18 -5
  75. package/lib/channels/channel-audit.js +3 -0
  76. package/lib/channels/channel-auth-context.js +1 -1
  77. package/lib/channels/channel-description.js +59 -0
  78. package/lib/channels/channel-integration-generator.js +13 -230
  79. package/lib/channels/channel-integration-template.js +94 -0
  80. package/lib/channels/channel-runtime-resolver.js +43 -3
  81. package/lib/channels/channel-status-display.js +66 -26
  82. package/lib/channels/channel-targets.js +3 -3
  83. package/lib/cli/index.js +31 -3
  84. package/lib/cli/infra-guided.js +5 -1
  85. package/lib/cli/setup-app-external-create.js +111 -0
  86. package/lib/cli/setup-app.help.js +1 -1
  87. package/lib/cli/setup-app.js +60 -130
  88. package/lib/cli/setup-app.test-commands.js +26 -52
  89. package/lib/cli/setup-certification-commands.js +4 -4
  90. package/lib/cli/setup-certification.help.js +9 -9
  91. package/lib/cli/setup-dev.js +30 -9
  92. package/lib/cli/setup-external-system-help.js +4 -6
  93. package/lib/cli/setup-external-system.js +58 -52
  94. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  95. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  96. package/lib/cli/setup-infra.js +15 -0
  97. package/lib/cli/setup-list.js +43 -0
  98. package/lib/cli/setup-utility-help-after.js +12 -0
  99. package/lib/cli/setup-utility-repair.js +26 -7
  100. package/lib/cli/setup-utility-validate.js +41 -2
  101. package/lib/cli/setup-utility.js +5 -3
  102. package/lib/commands/app.js +15 -43
  103. package/lib/commands/channel-add-setup.js +110 -0
  104. package/lib/commands/channel.js +42 -8
  105. package/lib/commands/datasource-sync-display.js +96 -0
  106. package/lib/commands/datasource-sync-policy.js +210 -0
  107. package/lib/commands/datasource-test-trust-cli.js +6 -6
  108. package/lib/commands/datasource-unified-test-cli.js +2 -1
  109. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  110. package/lib/commands/deploy-gate-failure-details.js +184 -0
  111. package/lib/commands/deploy-gate-orchestrator.js +368 -0
  112. package/lib/commands/dev-cli-handlers.js +7 -62
  113. package/lib/commands/dev-host-ops-params.js +91 -0
  114. package/lib/commands/dev-host-ops-poll.js +111 -0
  115. package/lib/commands/dev-host-ops.js +107 -94
  116. package/lib/commands/dev-init.js +6 -106
  117. package/lib/commands/dev-refresh.js +197 -0
  118. package/lib/commands/enterprise-knowledge.js +284 -0
  119. package/lib/commands/evidence-cli-leaves.js +250 -0
  120. package/lib/commands/evidence-kind.js +428 -0
  121. package/lib/commands/evidence.js +51 -0
  122. package/lib/commands/governance-cli-shared.js +2 -2
  123. package/lib/commands/governance-command-action.js +5 -3
  124. package/lib/commands/governance-fixture-subjects.js +85 -0
  125. package/lib/commands/governance.js +1 -1
  126. package/lib/commands/lifecycle-command-action.js +2 -2
  127. package/lib/commands/lifecycle-external.js +3 -3
  128. package/lib/commands/manifest-cli-auth.js +29 -0
  129. package/lib/commands/manifest-cli-commands.js +170 -0
  130. package/lib/commands/manifest-cli-integration-path.js +63 -0
  131. package/lib/commands/manifest.js +21 -0
  132. package/lib/commands/protection-cli-leaves.js +3 -3
  133. package/lib/commands/repair-auth-apply.js +15 -1
  134. package/lib/commands/repair-authentications-454.js +169 -0
  135. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  136. package/lib/commands/repair-datasource-apply.js +135 -0
  137. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  138. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  139. package/lib/commands/repair-datasource-operation-security.js +180 -0
  140. package/lib/commands/repair-datasource-run.js +7 -2
  141. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  142. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  143. package/lib/commands/repair-datasource.js +12 -68
  144. package/lib/commands/repair-env-template.js +11 -1
  145. package/lib/commands/repair-external-run.js +121 -31
  146. package/lib/commands/repair-internal.js +1 -1
  147. package/lib/commands/repair-openapi-export.js +156 -0
  148. package/lib/commands/repair-openapi-sync.js +33 -8
  149. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  150. package/lib/commands/repair-persist.js +22 -1
  151. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  152. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  153. package/lib/commands/repair-rbac.js +163 -86
  154. package/lib/commands/repair-steps.js +83 -18
  155. package/lib/commands/repair-system-permissions.js +1 -0
  156. package/lib/commands/repair.js +1 -1
  157. package/lib/commands/resource-type.js +166 -44
  158. package/lib/commands/role.js +452 -0
  159. package/lib/commands/run-post-publish-data-sync.js +68 -0
  160. package/lib/commands/setup-modes.js +1 -1
  161. package/lib/commands/setup.js +1 -1
  162. package/lib/commands/test-e2e-external.js +21 -8
  163. package/lib/commands/test-governance-cli-options.js +2 -2
  164. package/lib/commands/test-trust-cli-options.js +2 -2
  165. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  166. package/lib/commands/up-builder-api-provision.js +241 -0
  167. package/lib/commands/up-builder-api.js +88 -0
  168. package/lib/commands/up-common.js +25 -1
  169. package/lib/commands/upload-credential-push-log.js +117 -0
  170. package/lib/commands/upload-data-sync-finalize.js +60 -0
  171. package/lib/commands/upload-probe.js +66 -0
  172. package/lib/commands/upload-publish-context.js +4 -1
  173. package/lib/commands/upload-sidecar-followups.js +55 -27
  174. package/lib/commands/upload.js +116 -157
  175. package/lib/commands/validate-json.js +230 -0
  176. package/lib/commands/verify-governance-combined-external.js +1 -1
  177. package/lib/commands/verify-governance-db.js +2 -2
  178. package/lib/commands/verify-operations-command-action.js +2 -2
  179. package/lib/commands/verify-operations-step-plan.js +79 -41
  180. package/lib/commands/verify-operations-steps.js +2 -2
  181. package/lib/commands/verify-trust-command-action.js +1 -1
  182. package/lib/commands/wizard-core.js +1 -1
  183. package/lib/commands/wizard-headless.js +2 -1
  184. package/lib/core/admin-secrets.js +2 -6
  185. package/lib/core/audit-logger.js +1 -1
  186. package/lib/core/secrets-env-content.js +10 -4
  187. package/lib/core/secrets-env-write.js +2 -13
  188. package/lib/core/secrets-load.js +1 -3
  189. package/lib/datasource/agent-trust-run.js +3 -3
  190. package/lib/datasource/capability/relate-operations.js +1 -1
  191. package/lib/datasource/deploy.js +3 -1
  192. package/lib/datasource/test-e2e.js +6 -1
  193. package/lib/datasource/unified-validation-run-body.js +4 -1
  194. package/lib/datasource/unified-validation-run.js +1 -1
  195. package/lib/deployment/deploy-poll-ui.js +73 -12
  196. package/lib/deployment/deployer-poll-run.js +113 -0
  197. package/lib/deployment/deployer.js +17 -87
  198. package/lib/evidence/dataplane-context.js +21 -0
  199. package/lib/evidence/evidence-display.js +78 -0
  200. package/lib/evidence/evidence-service.js +392 -0
  201. package/lib/external-system/deploy.js +290 -112
  202. package/lib/external-system/download.js +7 -3
  203. package/lib/external-system/test-execution.js +1 -1
  204. package/lib/external-system/test-system-level.js +8 -10
  205. package/lib/external-system/test.js +12 -6
  206. package/lib/generator/deploy-script.js +73 -0
  207. package/lib/generator/external.js +2 -1
  208. package/lib/generator/helpers.js +13 -5
  209. package/lib/generator/index.js +17 -2
  210. package/lib/generator/split-variables.js +9 -3
  211. package/lib/generator/wizard.js +3 -36
  212. package/lib/infrastructure/helpers-docker-check.js +6 -0
  213. package/lib/infrastructure/helpers.js +1 -1
  214. package/lib/internal/fs-real-sync.js +22 -1
  215. package/lib/internal/node-fs.js +2 -0
  216. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  217. package/lib/lifecycle/verify-step-progress.js +1 -1
  218. package/lib/programmatic/access-log.js +26 -0
  219. package/lib/programmatic/auth-config.js +45 -0
  220. package/lib/programmatic/bearer-auth.js +176 -0
  221. package/lib/programmatic/builder-api-request.js +175 -0
  222. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  223. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  224. package/lib/programmatic/builder-api-server.js +230 -0
  225. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  226. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  227. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  228. package/lib/programmatic/builder-help-envelope.js +36 -0
  229. package/lib/programmatic/builder-help-fixtures.js +200 -0
  230. package/lib/programmatic/builder-help-governance.js +172 -0
  231. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  232. package/lib/programmatic/builder-help.js +361 -0
  233. package/lib/programmatic/capability-registry.js +77 -0
  234. package/lib/programmatic/command-options.js +32 -0
  235. package/lib/programmatic/enterprise-mcp-client.js +114 -0
  236. package/lib/programmatic/http-problem-details.js +99 -0
  237. package/lib/programmatic/http-route-match.js +40 -0
  238. package/lib/programmatic/idempotency-cache.js +69 -0
  239. package/lib/programmatic/index.js +53 -0
  240. package/lib/programmatic/integration-path-scope.js +39 -0
  241. package/lib/programmatic/log-redaction.js +66 -0
  242. package/lib/programmatic/manifest-get-section.js +146 -0
  243. package/lib/programmatic/manifest-patch-section.js +252 -0
  244. package/lib/programmatic/manifest-repair.js +122 -0
  245. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  246. package/lib/programmatic/manifest-section-io.js +225 -0
  247. package/lib/programmatic/manifest-section-quality.js +171 -0
  248. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  249. package/lib/programmatic/manifest-section-registry.js +222 -0
  250. package/lib/programmatic/nest-http-bridge.js +34 -0
  251. package/lib/programmatic/openapi-component-schemas.js +68 -0
  252. package/lib/programmatic/openapi-description-enricher.js +117 -0
  253. package/lib/programmatic/openapi-descriptions.js +190 -0
  254. package/lib/programmatic/openapi-docs-serving.js +123 -0
  255. package/lib/programmatic/openapi-help-schemas.js +63 -0
  256. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  258. package/lib/programmatic/openapi-request-schemas.js +155 -0
  259. package/lib/programmatic/openapi-result-schemas.js +493 -0
  260. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  261. package/lib/programmatic/openapi-schema-descriptions-core.js +162 -0
  262. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  263. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  264. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  265. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  266. package/lib/programmatic/openapi-schema-helpers.js +108 -0
  267. package/lib/programmatic/openapi-spec.js +203 -0
  268. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  269. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  270. package/lib/programmatic/request-timeout.js +53 -0
  271. package/lib/programmatic/route-handler-map.js +143 -0
  272. package/lib/programmatic/route-handlers-context.js +29 -0
  273. package/lib/programmatic/route-handlers.js +33 -0
  274. package/lib/programmatic/run-certify.js +57 -0
  275. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  276. package/lib/programmatic/run-lifecycle.js +29 -0
  277. package/lib/programmatic/run-repair.js +41 -0
  278. package/lib/programmatic/run-repository-emcp.js +62 -0
  279. package/lib/programmatic/run-template-workspace.js +74 -0
  280. package/lib/programmatic/run-test.js +49 -0
  281. package/lib/programmatic/run-upload.js +63 -0
  282. package/lib/programmatic/run-validate.js +53 -0
  283. package/lib/programmatic/run-wizard.js +40 -0
  284. package/lib/programmatic/system-key.js +48 -0
  285. package/lib/programmatic/wizard-config-normalize.js +118 -0
  286. package/lib/programmatic/workspace-cleanup.js +128 -0
  287. package/lib/programmatic/workspace-context.js +145 -0
  288. package/lib/programmatic/workspace-lock.js +75 -0
  289. package/lib/programmatic/workspace-meta.js +64 -0
  290. package/lib/programmatic/workspace-ops.js +149 -0
  291. package/lib/protection/run-commands-upload-sync.js +35 -0
  292. package/lib/protection/run-commands.js +2 -20
  293. package/lib/protection/upload-batch.js +11 -7
  294. package/lib/resolvers/evidence-kind-file.js +230 -0
  295. package/lib/resolvers/resource-type-file.js +58 -1
  296. package/lib/resolvers/role-file.js +227 -0
  297. package/lib/schema/application-schema.json +22 -2
  298. package/lib/schema/external-datasource.schema.json +245 -2
  299. package/lib/schema/external-system.schema.json +259 -119
  300. package/lib/schema/flag-map-validation-run.json +3 -0
  301. package/lib/schema/infra.parameter.yaml +25 -1
  302. package/lib/schema/type/credential-field-registry.json +21 -5
  303. package/lib/schema/type/document-storage.json +9 -0
  304. package/lib/utils/agent-trust-run-display.js +1 -1
  305. package/lib/utils/api.js +8 -2
  306. package/lib/utils/app-path-resolve.js +168 -0
  307. package/lib/utils/app-register-config.js +4 -3
  308. package/lib/utils/authentication-env-template.js +222 -0
  309. package/lib/utils/cli-sync-options.js +62 -10
  310. package/lib/utils/cli-utils.js +15 -3
  311. package/lib/utils/cli-workspace-options.js +29 -0
  312. package/lib/utils/compose-generate-docker-compose.js +102 -0
  313. package/lib/utils/configuration-env-resolver.js +203 -27
  314. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  315. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  316. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  317. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  318. package/lib/utils/datasource-test-run-display.js +2 -1
  319. package/lib/utils/dev-ca-install.js +5 -6
  320. package/lib/utils/dev-config.js +2 -2
  321. package/lib/utils/dev-init-ssh-merge.js +165 -23
  322. package/lib/utils/dev-list-sort.js +145 -0
  323. package/lib/utils/dev-pin-share-instructions.js +110 -0
  324. package/lib/utils/dev-platform-tls.js +0 -63
  325. package/lib/utils/dev-ssh-config-helper.js +177 -33
  326. package/lib/utils/docker-build.js +46 -27
  327. package/lib/utils/docker-daemon-tls-ca.js +1 -1
  328. package/lib/utils/docker-exec.js +91 -6
  329. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  330. package/lib/utils/env-copy.js +3 -4
  331. package/lib/utils/env-dotenv-format.js +103 -0
  332. package/lib/utils/error-formatters/error-parser.js +0 -3
  333. package/lib/utils/external-env-template.js +5 -2
  334. package/lib/utils/external-system-display.js +5 -1
  335. package/lib/utils/external-system-readiness-compact-blocks.js +248 -0
  336. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  337. package/lib/utils/external-system-readiness-core.js +16 -0
  338. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  339. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  340. package/lib/utils/external-system-readiness-display.js +20 -30
  341. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  342. package/lib/utils/external-system-system-test-tty.js +5 -41
  343. package/lib/utils/health-check-request.js +2 -3
  344. package/lib/utils/help-builder.js +9 -1
  345. package/lib/utils/host-ops-job-labels.js +236 -0
  346. package/lib/utils/host-ops-job-result.js +61 -0
  347. package/lib/utils/host-ops-poll-ui.js +163 -0
  348. package/lib/utils/image-name.js +22 -4
  349. package/lib/utils/integration-path-resolve.js +112 -0
  350. package/lib/utils/logger.js +37 -4
  351. package/lib/utils/manifest-source-emit.js +1 -1
  352. package/lib/utils/paths-reload-source.js +148 -0
  353. package/lib/utils/paths-system-builder-keys.js +25 -0
  354. package/lib/utils/paths.js +183 -30
  355. package/lib/utils/pipeline-upload-auth-retry.js +4 -0
  356. package/lib/utils/postgres-platform-bootstrap.js +24 -17
  357. package/lib/utils/postgres-wipe.js +5 -2
  358. package/lib/utils/remote-dev-auth.js +39 -4
  359. package/lib/utils/resolve-docker-image-ref.js +36 -6
  360. package/lib/utils/runtime-configuration-values.js +64 -2
  361. package/lib/utils/secrets-helpers.js +5 -1
  362. package/lib/utils/ssh-known-hosts.js +130 -0
  363. package/lib/utils/test-target-cli-options.js +75 -0
  364. package/lib/utils/token-manager.js +16 -0
  365. package/lib/utils/upload-sync-options.js +20 -2
  366. package/lib/utils/validation-run-request.js +11 -2
  367. package/lib/validation/external-manifest-validator.js +11 -1
  368. package/lib/validation/openapi-contract-surface-validator.js +430 -0
  369. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  370. package/lib/validation/validate-external-file.js +160 -0
  371. package/lib/validation/validate.js +6 -117
  372. package/lib/validation/validator.js +6 -5
  373. package/package.json +76 -37
  374. package/packages/builder-api/README.md +120 -0
  375. package/packages/builder-api/package.json +30 -0
  376. package/packages/builder-api/src/app.module.ts +7 -0
  377. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  378. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  379. package/packages/builder-api/src/main.ts +16 -0
  380. package/packages/builder-api/tsconfig.json +15 -0
  381. package/scripts/check-builder-api-architecture-grep.js +79 -0
  382. package/scripts/docker_image_content_gate.js +47 -0
  383. package/scripts/docker_image_content_gate.sh +5 -0
  384. package/scripts/export-builder-api-evidence.js +262 -0
  385. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  386. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  387. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  388. package/scripts/lib/plan-actor.js +109 -0
  389. package/scripts/lib/plan-config.js +20 -0
  390. package/scripts/lib/plan-gates.js +154 -0
  391. package/scripts/lib/plan-meta.js +104 -0
  392. package/scripts/lib/plan-parse.js +162 -0
  393. package/scripts/lib/plan-prevalidate-gates.js +337 -0
  394. package/scripts/lib/plan-run-core.js +125 -0
  395. package/scripts/lib/plan-run-report.js +119 -0
  396. package/scripts/plan-approve.js +24 -0
  397. package/scripts/plan-archive.js +49 -0
  398. package/scripts/plan-run.js +13 -0
  399. package/scripts/plan-set-actor.js +21 -0
  400. package/scripts/plan-validate.js +80 -0
  401. package/scripts/pnpm/af.mjs +110 -0
  402. package/scripts/pnpm/check-quiet.mjs +32 -0
  403. package/scripts/pnpm/dev-install.mjs +29 -0
  404. package/scripts/pnpm/dev-reload.mjs +18 -0
  405. package/scripts/pnpm/help.mjs +55 -0
  406. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  407. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  408. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  409. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  410. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  411. package/scripts/pnpm/lib/spinner.mjs +42 -0
  412. package/scripts/stage_builder_api_for_docker.js +65 -0
  413. package/scripts/sync-builder-api-template.js +44 -0
  414. package/templates/README.md +3 -0
  415. package/templates/applications/builder-api/Dockerfile +38 -0
  416. package/templates/applications/builder-api/application.yaml +75 -0
  417. package/templates/applications/builder-api/env.template +48 -0
  418. package/templates/applications/dataplane/application.yaml +27 -5
  419. package/templates/applications/dataplane/env.template +38 -15
  420. package/templates/applications/dataplane/rbac.yaml +85 -3
  421. package/templates/applications/miso-controller/application.yaml +10 -1
  422. package/templates/applications/miso-controller/env.template +11 -10
  423. package/templates/applications/miso-controller/rbac.yaml +72 -0
  424. package/templates/channels/README.md +18 -0
  425. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  426. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  427. package/templates/channels/chatgpt/integration/README.md +11 -0
  428. package/templates/channels/chatgpt/integration/application.json +15 -0
  429. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  430. package/templates/channels/chatgpt/integration/env.template +4 -0
  431. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  432. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  433. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  434. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  435. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  436. package/templates/channels/slack/install.template.md.hbs +48 -18
  437. package/templates/channels/slack/integration/README.md +38 -0
  438. package/templates/channels/slack/integration/application.json +18 -0
  439. package/templates/channels/slack/integration/env.template +29 -0
  440. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  441. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  442. package/templates/channels/slack/integration/slack-system.json +144 -0
  443. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  444. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  445. package/templates/channels/teams-bot/integration/README.md +18 -0
  446. package/templates/channels/teams-bot/integration/application.json +17 -0
  447. package/templates/channels/teams-bot/integration/env.template +5 -0
  448. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  449. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  450. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  451. package/templates/channels/web-embed/integration/README.md +11 -0
  452. package/templates/channels/web-embed/integration/application.json +15 -0
  453. package/templates/channels/web-embed/integration/env.template +4 -0
  454. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  455. package/templates/openapi/redoc_page.html +86 -0
  456. package/templates/python/docker-compose.hbs +11 -0
  457. package/templates/python/requirements.txt +2 -2
  458. package/templates/typescript/docker-compose.hbs +11 -0
  459. package/lib/certification/cli-cert-sync-skip.js +0 -21
package/lib/cli/index.js CHANGED
@@ -23,15 +23,21 @@ const { setupAppCommands: setupAppManagementCommands } = require('../commands/ap
23
23
  const { setupDatasourceCommands } = require('../commands/datasource');
24
24
  const { setupDimensionCommands } = require('../commands/dimension');
25
25
  const { setupResourceTypeCommands } = require('../commands/resource-type');
26
+ const { setupRoleCommands } = require('../commands/role');
27
+ const { setupEvidenceKindCommands } = require('../commands/evidence-kind');
28
+ const { setupEnterpriseKnowledgeCommands } = require('../commands/enterprise-knowledge');
26
29
  const { setupIdentityCommands } = require('../commands/identity');
27
30
  const { setupProtectionCommands } = require('../commands/protection');
31
+ const { setupEvidenceCommands } = require('../commands/evidence');
28
32
  const { setupCredentialDeploymentCommands } = require('./setup-credential-deployment');
29
33
  const { setupIntegrationClientCommands } = require('./setup-integration-client');
30
34
  const { setupPlatformCommands } = require('./setup-platform');
31
35
  const { setupCertificationCommands } = require('./setup-certification-commands');
32
36
  const { setupGovernanceCommands } = require('../commands/governance');
33
37
  const { setupChannelCommands } = require('../commands/channel');
38
+ const { setupManifestCommands } = require('../commands/manifest');
34
39
  const { setupNpmCommands } = require('./setup-npm');
40
+ const { setupListCommand } = require('./setup-list');
35
41
 
36
42
  /**
37
43
  * Dev, secrets, parameters, and platform commands (keeps setupCommands under statement limit).
@@ -46,10 +52,10 @@ function setupDevAndPlatformCommands(program) {
46
52
  }
47
53
 
48
54
  /**
49
- * Sets up all CLI commands on the Commander program instance
50
- * @param {Command} program - Commander program instance
55
+ * Core platform and integration CLI command groups.
56
+ * @param {import('commander').Command} program
51
57
  */
52
- function setupCommands(program) {
58
+ function setupCoreCliCommands(program) {
53
59
  setupInfraCommands(program);
54
60
  setupAuthCommands(program);
55
61
  setupAppCommands(program);
@@ -59,14 +65,36 @@ function setupCommands(program) {
59
65
  setupAppManagementCommands(program);
60
66
  setupChannelCommands(program);
61
67
  setupDatasourceCommands(program);
68
+ setupManifestCommands(program);
69
+ }
70
+
71
+ /**
72
+ * Extended catalog and policy CLI command groups.
73
+ * @param {import('commander').Command} program
74
+ */
75
+ function setupExtendedCliCommands(program) {
62
76
  setupDimensionCommands(program);
63
77
  setupResourceTypeCommands(program);
78
+ setupRoleCommands(program);
79
+ setupEvidenceKindCommands(program);
80
+ setupEnterpriseKnowledgeCommands(program);
64
81
  setupIdentityCommands(program);
65
82
  setupProtectionCommands(program);
83
+ setupEvidenceCommands(program);
66
84
  setupUtilityCommands(program);
85
+ setupListCommand(program);
67
86
  setupCredentialDeploymentCommands(program);
68
87
  setupIntegrationClientCommands(program);
69
88
  setupExternalSystemCommands(program);
89
+ }
90
+
91
+ /**
92
+ * Sets up all CLI commands on the Commander program instance
93
+ * @param {Command} program - Commander program instance
94
+ */
95
+ function setupCommands(program) {
96
+ setupCoreCliCommands(program);
97
+ setupExtendedCliCommands(program);
70
98
  setupDevAndPlatformCommands(program);
71
99
  }
72
100
 
@@ -15,6 +15,7 @@ const infra = require('../infrastructure');
15
15
  const { execWithDockerEnv } = require('../utils/docker-exec');
16
16
  const { getLogLevel, passesLevelFilter } = require('../commands/app-logs');
17
17
  const { handleLogin } = require('../commands/login');
18
+ const { handleUpBuilderApi } = require('../commands/up-builder-api');
18
19
  const {
19
20
  resolveGuidedAuthControllerUrl,
20
21
  runGuidedAuthStep,
@@ -309,7 +310,10 @@ async function runGuidedUpPlatform(options, handleUpMiso, handleUpDataplane, han
309
310
  await runGuidedAuthStep(handleLogin, authOpts, { startSpinner, stopSpinnerSuccess });
310
311
  const controllerUrl = await resolveGuidedAuthControllerUrl(authOpts);
311
312
  await runGuidedDataplaneInstallPhase(options, handleUpDataplane, handleLogin, controllerUrl);
312
- await validateAppErrorLogs(['miso-controller', 'dataplane']);
313
+ const baSpin = startSpinner('Starting builder-api...');
314
+ await withMutedLogger(() => handleUpBuilderApi({ ...options, platformInstall: true }));
315
+ stopSpinnerSuccess(baSpin, 'Builder API ready');
316
+ await validateAppErrorLogs(['miso-controller', 'dataplane', 'builder-api']);
313
317
  await logPlatformReadyFooter();
314
318
  }
315
319
 
@@ -0,0 +1,111 @@
1
+ /**
2
+ * External-system create option normalization for setup-app.js.
3
+ *
4
+ * @fileoverview Headless external create CLI helpers
5
+ */
6
+
7
+ const VALID_ENTITY_TYPES = ['recordStorage', 'documentStorage', 'vectorStore', 'messageService', 'none'];
8
+
9
+ /**
10
+ * Normalize options for external system creation
11
+ * @param {Object} options - Raw CLI options
12
+ * @returns {Object} Normalized options
13
+ */
14
+ function normalizeExternalOptions(options) {
15
+ const normalized = { ...options };
16
+ if (options.displayName) normalized.systemDisplayName = options.displayName;
17
+ if (options.description) normalized.systemDescription = options.description;
18
+ if (options.systemType) normalized.systemType = options.systemType;
19
+ if (options.authType) normalized.authType = options.authType;
20
+ if (options.entityType) {
21
+ if (!VALID_ENTITY_TYPES.includes(options.entityType)) {
22
+ throw new Error(`Invalid --entity-type. Must be one of: ${VALID_ENTITY_TYPES.join(', ')}`);
23
+ }
24
+ normalized.entityType = options.entityType;
25
+ }
26
+ if (options.datasources !== undefined) {
27
+ const parsedCount = parseInt(options.datasources, 10);
28
+ if (Number.isNaN(parsedCount) || parsedCount < 1 || parsedCount > 10) {
29
+ throw new Error('Datasources count must be a number between 1 and 10');
30
+ }
31
+ normalized.datasourceCount = parsedCount;
32
+ }
33
+ if (options.controller) {
34
+ normalized.controller = true;
35
+ normalized.controllerUrl = options.controller;
36
+ }
37
+ return normalized;
38
+ }
39
+
40
+ /**
41
+ * Whether normalized options include all external CLI fields for headless create.
42
+ * @param {Object} normalized - Normalized external create options
43
+ * @returns {boolean}
44
+ */
45
+ function hasFullExternalCliOptions(normalized) {
46
+ return Boolean(
47
+ normalized.systemKey &&
48
+ normalized.systemDisplayName &&
49
+ normalized.systemDescription &&
50
+ normalized.systemType &&
51
+ normalized.authType &&
52
+ normalized.entityType &&
53
+ normalized.datasourceCount
54
+ );
55
+ }
56
+
57
+ /**
58
+ * Map positional systemKey and apply headless defaults for external create.
59
+ * @param {string} appName - Positional appKey or systemKey from CLI
60
+ * @param {Object} options - Raw CLI options
61
+ * @returns {Object} Normalized options ready for createApp
62
+ */
63
+ function prepareExternalCreateOptions(appName, options) {
64
+ const normalized = normalizeExternalOptions(options);
65
+ const isExternalType = options.type === 'external' || !options.type;
66
+
67
+ if (isExternalType && appName) {
68
+ normalized.systemKey = appName;
69
+ }
70
+
71
+ if (isExternalType && hasFullExternalCliOptions(normalized)) {
72
+ if (!Object.prototype.hasOwnProperty.call(normalized, 'github')) {
73
+ normalized.github = false;
74
+ }
75
+ if (!Object.prototype.hasOwnProperty.call(normalized, 'controller')) {
76
+ normalized.controller = false;
77
+ }
78
+ }
79
+
80
+ return normalized;
81
+ }
82
+
83
+ /**
84
+ * Validate required options for non-interactive external creation
85
+ * @param {Object} normalizedOptions - Normalized options
86
+ * @throws {Error} If required options are missing
87
+ */
88
+ function validateNonInteractiveExternalOptions(normalizedOptions) {
89
+ const missing = [];
90
+ if (!normalizedOptions.systemDisplayName) missing.push('--display-name');
91
+ if (!normalizedOptions.systemDescription) missing.push('--description');
92
+ if (!normalizedOptions.systemType) missing.push('--system-type');
93
+ if (!normalizedOptions.authType) missing.push('--auth-type');
94
+ if (!normalizedOptions.entityType) missing.push('--entity-type');
95
+ if (!normalizedOptions.datasourceCount) missing.push('--datasources');
96
+ if (missing.length > 0) {
97
+ throw new Error(`Missing required options for non-interactive external create: ${missing.join(', ')}`);
98
+ }
99
+ if (!Object.prototype.hasOwnProperty.call(normalizedOptions, 'github')) {
100
+ normalizedOptions.github = false;
101
+ }
102
+ if (!Object.prototype.hasOwnProperty.call(normalizedOptions, 'controller')) {
103
+ normalizedOptions.controller = false;
104
+ }
105
+ }
106
+
107
+ module.exports = {
108
+ normalizeExternalOptions,
109
+ prepareExternalCreateOptions,
110
+ validateNonInteractiveExternalOptions
111
+ };
@@ -56,7 +56,7 @@ Examples:
56
56
  Notes:
57
57
  - To run E2E for one datasource, use:
58
58
  aifabrix datasource test-e2e <datasourceKey>
59
- - External integration: local system and datasource files are published to the dataplane before E2E (same as upload). Use --no-sync to exercise only config already deployed.
59
+ - External integration: local system and datasource files are published to the dataplane before E2E (same as upload). Use --no-publish to exercise only config already deployed.
60
60
  `;
61
61
 
62
62
  const IDENTITY_HELP_AFTER = `
@@ -13,6 +13,10 @@ const app = require('../app');
13
13
  const logger = require('../utils/logger');
14
14
  const { handleCommandError } = require('../utils/cli-utils');
15
15
  const { setupInstallTestE2eLintCommands } = require('./setup-app.test-commands');
16
+ const {
17
+ prepareExternalCreateOptions,
18
+ validateNonInteractiveExternalOptions
19
+ } = require('./setup-app-external-create');
16
20
 
17
21
  const CREATE_HELP_AFTER = `
18
22
  Examples:
@@ -46,18 +50,20 @@ Examples:
46
50
  $ aifabrix push myapp --registry $ACR_REGISTRY --tag $IMAGE_TAG
47
51
  $ aifabrix deploy myapp \\
48
52
  --client-id "$DEV_MISO_CLIENTID" \\
49
- --client-secret "$DEV_MISO_CLIENTSECRET" \\
50
- --no-poll
53
+ --client-secret "$DEV_MISO_CLIENTSECRET"
51
54
 
52
55
  # CI/CD — external integration (after upload/tests; promote to controller)
53
56
  $ aifabrix validate hubspot-demo
54
57
  $ aifabrix upload hubspot-demo --probe
55
- $ aifabrix deploy hubspot-demo --probe --no-poll
58
+ $ aifabrix deploy hubspot-demo --probe -v
59
+ $ aifabrix deploy ek-sales --gate full --subject-email ops@example.com
56
60
 
57
61
  Notes:
58
62
  - Login or set MISO_CONTROLLER_URL + environment (aifabrix login / aifabrix auth).
59
63
  - CI: register once (aifabrix app register <appKey>), store DEV_MISO_CLIENTID and DEV_MISO_CLIENTSECRET in pipeline secrets.
60
64
  - upload = dataplane publish for dev iteration; deploy = controller validate + deploy (Azure or local Docker).
65
+ - Default output is a compact status card; use -v for expanded preflight and readiness detail.
66
+ - Controller deploy always polls to a terminal status (no --poll / --no-poll on this command).
61
67
  - --repository-url overrides repo URL for pipeline validate (default: application.yaml repository.repositoryUrl).
62
68
  `;
63
69
 
@@ -79,106 +85,6 @@ Notes:
79
85
  - Use -t 0 (--tail 0) for the full buffered log; default is 100 lines.
80
86
  `;
81
87
 
82
- /**
83
- * Normalize options for external system creation
84
- * @param {Object} options - Raw CLI options
85
- * @returns {Object} Normalized options
86
- */
87
- const VALID_ENTITY_TYPES = ['recordStorage', 'documentStorage', 'vectorStore', 'messageService', 'none'];
88
-
89
- function normalizeExternalOptions(options) {
90
- const normalized = { ...options };
91
- if (options.displayName) normalized.systemDisplayName = options.displayName;
92
- if (options.description) normalized.systemDescription = options.description;
93
- if (options.systemType) normalized.systemType = options.systemType;
94
- if (options.authType) normalized.authType = options.authType;
95
- if (options.entityType) {
96
- if (!VALID_ENTITY_TYPES.includes(options.entityType)) {
97
- throw new Error(`Invalid --entity-type. Must be one of: ${VALID_ENTITY_TYPES.join(', ')}`);
98
- }
99
- normalized.entityType = options.entityType;
100
- }
101
- if (options.datasources !== undefined) {
102
- const parsedCount = parseInt(options.datasources, 10);
103
- if (Number.isNaN(parsedCount) || parsedCount < 1 || parsedCount > 10) {
104
- throw new Error('Datasources count must be a number between 1 and 10');
105
- }
106
- normalized.datasourceCount = parsedCount;
107
- }
108
- if (options.controller) {
109
- normalized.controller = true;
110
- normalized.controllerUrl = options.controller;
111
- }
112
- return normalized;
113
- }
114
-
115
- /**
116
- * Whether normalized options include all external CLI fields for headless create.
117
- * @param {Object} normalized - Normalized external create options
118
- * @returns {boolean}
119
- */
120
- function hasFullExternalCliOptions(normalized) {
121
- return Boolean(
122
- normalized.systemKey &&
123
- normalized.systemDisplayName &&
124
- normalized.systemDescription &&
125
- normalized.systemType &&
126
- normalized.authType &&
127
- normalized.entityType &&
128
- normalized.datasourceCount
129
- );
130
- }
131
-
132
- /**
133
- * Map positional systemKey and apply headless defaults for external create.
134
- * @param {string} appName - Positional appKey or systemKey from CLI
135
- * @param {Object} options - Raw CLI options
136
- * @returns {Object} Normalized options ready for createApp
137
- */
138
- function prepareExternalCreateOptions(appName, options) {
139
- const normalized = normalizeExternalOptions(options);
140
- const isExternalType = options.type === 'external' || !options.type;
141
-
142
- if (isExternalType && appName) {
143
- normalized.systemKey = appName;
144
- }
145
-
146
- if (isExternalType && hasFullExternalCliOptions(normalized)) {
147
- if (!Object.prototype.hasOwnProperty.call(normalized, 'github')) {
148
- normalized.github = false;
149
- }
150
- if (!Object.prototype.hasOwnProperty.call(normalized, 'controller')) {
151
- normalized.controller = false;
152
- }
153
- }
154
-
155
- return normalized;
156
- }
157
-
158
- /**
159
- * Validate required options for non-interactive external creation
160
- * @param {Object} normalizedOptions - Normalized options
161
- * @throws {Error} If required options are missing
162
- */
163
- function validateNonInteractiveExternalOptions(normalizedOptions) {
164
- const missing = [];
165
- if (!normalizedOptions.systemDisplayName) missing.push('--display-name');
166
- if (!normalizedOptions.systemDescription) missing.push('--description');
167
- if (!normalizedOptions.systemType) missing.push('--system-type');
168
- if (!normalizedOptions.authType) missing.push('--auth-type');
169
- if (!normalizedOptions.entityType) missing.push('--entity-type');
170
- if (!normalizedOptions.datasourceCount) missing.push('--datasources');
171
- if (missing.length > 0) {
172
- throw new Error(`Missing required options for non-interactive external create: ${missing.join(', ')}`);
173
- }
174
- if (!Object.prototype.hasOwnProperty.call(normalizedOptions, 'github')) {
175
- normalizedOptions.github = false;
176
- }
177
- if (!Object.prototype.hasOwnProperty.call(normalizedOptions, 'controller')) {
178
- normalizedOptions.controller = false;
179
- }
180
- }
181
-
182
88
  /**
183
89
  * Handle create command execution
184
90
  * @async
@@ -315,7 +221,7 @@ Examples:
315
221
  });
316
222
  }
317
223
 
318
- function setupBuildRunLogsDownCommands(program) {
224
+ function registerBuildCommand(program) {
319
225
  program.command('build <appKey>')
320
226
  .description('Build Docker image for builder appKey (auto-detect runtime)')
321
227
  .option('-l, --language <lang>', 'Override language detection')
@@ -339,9 +245,9 @@ function setupBuildRunLogsDownCommands(program) {
339
245
  process.exit(1);
340
246
  }
341
247
  });
248
+ }
342
249
 
343
- registerRunCommand(program);
344
-
250
+ function registerLogsCommand(program) {
345
251
  program.command('logs <appKey>')
346
252
  .description('Tail container logs for appKey (optional env summary; secrets masked)')
347
253
  .option('-f', 'Follow log stream')
@@ -352,14 +258,22 @@ function setupBuildRunLogsDownCommands(program) {
352
258
  try {
353
259
  const { runAppLogs } = require('../commands/app-logs');
354
260
  const tailNum = parseInt(options.tail, 10);
355
- const level = options.level !== undefined && options.level !== null && options.level !== '' ? String(options.level).trim() : undefined;
356
- await runAppLogs(appName, { follow: options.f, tail: Number.isNaN(tailNum) ? 100 : tailNum, level });
261
+ const level = options.level !== undefined && options.level !== null && options.level !== ''
262
+ ? String(options.level).trim()
263
+ : undefined;
264
+ await runAppLogs(appName, {
265
+ follow: options.f,
266
+ tail: Number.isNaN(tailNum) ? 100 : tailNum,
267
+ level
268
+ });
357
269
  } catch (error) {
358
270
  handleCommandError(error, 'logs');
359
271
  process.exit(1);
360
272
  }
361
273
  });
274
+ }
362
275
 
276
+ function registerDownAppCommand(program) {
363
277
  program.command('down-app <appKey>')
364
278
  .description('Stop and remove container for appKey (--volumes removes data volume)')
365
279
  .option('--volumes', 'Remove application Docker volume')
@@ -374,6 +288,13 @@ function setupBuildRunLogsDownCommands(program) {
374
288
  });
375
289
  }
376
290
 
291
+ function setupBuildRunLogsDownCommands(program) {
292
+ registerBuildCommand(program);
293
+ registerRunCommand(program);
294
+ registerLogsCommand(program);
295
+ registerDownAppCommand(program);
296
+ }
297
+
377
298
  function setupShellTestStopCommands(program) {
378
299
  program.command('stop <appKey>')
379
300
  .description('Alias for down-app: stop and remove container for appKey')
@@ -419,21 +340,7 @@ function setupDockerfileGenerateCommand(program) {
419
340
  });
420
341
  }
421
342
 
422
- function setupPushDeployDockerfileCommands(program) {
423
- program.command('push <appKey>')
424
- .description('Push builder appKey image to Azure Container Registry')
425
- .addHelpText('after', PUSH_HELP_AFTER)
426
- .option('-r, --registry <registry>', 'ACR registry URL (overrides application.yaml)')
427
- .option('-t, --tag <tag>', 'Image tag(s) - comma-separated for multiple (default: latest)')
428
- .action(async(appName, options) => {
429
- try {
430
- await app.pushApp(appName, options);
431
- } catch (error) {
432
- handleCommandError(error, 'push');
433
- process.exit(1);
434
- }
435
- });
436
-
343
+ function setupDeployCommand(program) {
437
344
  program.command('deploy <appKey|systemKey>')
438
345
  .description('Deploy builder app or external system via Miso Controller (Azure or --local)')
439
346
  .addHelpText('after', DEPLOY_HELP_AFTER)
@@ -441,13 +348,20 @@ function setupPushDeployDockerfileCommands(program) {
441
348
  .option('--client-id <id>', 'Client ID (overrides config)')
442
349
  .option('--client-secret <secret>', 'Client Secret (overrides config)')
443
350
  .option('--repository-url <url>', 'Repository URL for pipeline validation (default: application.yaml repository.repositoryUrl, else https://github.com/aifabrix/<appKey>)')
444
- .option('--poll', 'Poll for deployment status', true)
445
- .option('--no-poll', 'Do not poll for status')
351
+ .option('-v, --verbose', 'Expanded deploy summary and preflight progress')
446
352
  .option('--probe', 'After external deploy, run dataplane runtime checks (validation/run); slower')
447
353
  .option('--probe-timeout <ms>', 'Timeout for --probe on external deploy (default: 120000)', '120000')
448
354
  .option(
449
- '--no-cert-sync',
450
- 'Skip updating integration certification in the system file from the dataplane after external deploy'
355
+ '--sync',
356
+ 'After deploy, run full datasource data sync for every datasource on the system (default: bootstrap-if-empty only)'
357
+ )
358
+ .option(
359
+ '--gate <gates>',
360
+ 'Optional pre-promote gates (comma-separated): operations, trust, governance, full'
361
+ )
362
+ .option(
363
+ '--subject-email <emails>',
364
+ 'Subject email(s) for governance gate (comma-separated; used with --gate governance|full)'
451
365
  )
452
366
  .action(async(appName, options) => {
453
367
  try {
@@ -458,6 +372,7 @@ function setupPushDeployDockerfileCommands(program) {
458
372
  const opts = {
459
373
  ...options,
460
374
  local: !!options.local,
375
+ verbose: options.verbose === true,
461
376
  probeTimeout: Number.isFinite(probeTimeout) ? probeTimeout : 120000
462
377
  };
463
378
  const outcome = await app.deployApp(appName, opts);
@@ -470,7 +385,24 @@ function setupPushDeployDockerfileCommands(program) {
470
385
  process.exit(1);
471
386
  }
472
387
  });
388
+ }
473
389
 
390
+ function setupPushDeployDockerfileCommands(program) {
391
+ program.command('push <appKey>')
392
+ .description('Push builder appKey image to Azure Container Registry')
393
+ .addHelpText('after', PUSH_HELP_AFTER)
394
+ .option('-r, --registry <registry>', 'ACR registry URL (overrides application.yaml)')
395
+ .option('-t, --tag <tag>', 'Image tag(s) - comma-separated for multiple (default: latest)')
396
+ .action(async(appName, options) => {
397
+ try {
398
+ await app.pushApp(appName, options);
399
+ } catch (error) {
400
+ handleCommandError(error, 'push');
401
+ process.exit(1);
402
+ }
403
+ });
404
+
405
+ setupDeployCommand(program);
474
406
  setupDockerfileGenerateCommand(program);
475
407
  }
476
408
 
@@ -489,7 +421,5 @@ function setupAppCommands(program) {
489
421
 
490
422
  module.exports = {
491
423
  setupAppCommands,
492
- normalizeExternalOptions,
493
- prepareExternalCreateOptions,
494
- validateNonInteractiveExternalOptions
424
+ ...require('./setup-app-external-create')
495
425
  };
@@ -7,7 +7,6 @@
7
7
  const chalk = require('chalk');
8
8
  const logger = require('../utils/logger');
9
9
  const { handleCommandError } = require('../utils/cli-utils');
10
- const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
11
10
  const {
12
11
  TEST_HELP_AFTER,
13
12
  TEST_E2E_HELP_AFTER
@@ -18,7 +17,7 @@ function setupTestCommand(program) {
18
17
  .description('Tests: builder appKey in container; external systemKey = local validation')
19
18
  .option('-e, --env <env>', 'For builder app: dev (running container) or tst (ephemeral)', 'dev')
20
19
  .option('-v, --verbose', 'Verbose output')
21
- .option('-d, --debug', 'Write debug log to integration/<systemKey>/logs/ (external only)')
20
+ .option('-d, --debug', 'Certification debug + log to integration/<systemKey>/logs/ (external only)')
22
21
  .option(
23
22
  '--sync',
24
23
  'Not supported for this command (local validation only). Use aifabrix upload <systemKey> or dataplane test commands with --sync.'
@@ -58,45 +57,22 @@ function setupTestCommand(program) {
58
57
  }
59
58
 
60
59
  /**
61
- * First failed `certificateIssuance` across E2E datasource rows (for cert-sync hint).
62
- * @param {Array<{ key?: string, datasourceTestRun?: { certificateIssuance?: { status?: string, reasonCode?: string, message?: string } } }>} results
63
- * @returns {string|null}
64
- */
65
- function firstIssuanceFailureHintFromE2eResults(results) {
66
- const failed = [];
67
- for (const row of results || []) {
68
- const ci = row.datasourceTestRun && row.datasourceTestRun.certificateIssuance;
69
- if (ci && ci.status === 'failed') {
70
- failed.push({ key: row.key, ci });
71
- }
72
- }
73
- if (failed.length === 0) return null;
74
- const firstRc = failed[0].ci.reasonCode;
75
- const sameAll = failed.every(f => f.ci.reasonCode === firstRc);
76
- if (sameAll && failed.length > 1) {
77
- const parts = [firstRc, failed[0].ci.message].filter(Boolean);
78
- return `${parts.join(': ')} (${failed.length} datasource scopes; first: ${failed[0].key})`;
79
- }
80
- const parts = [failed[0].ci.reasonCode, failed[0].ci.message].filter(Boolean);
81
- return `[${failed[0].key}] ${parts.join(': ')}`.trim();
82
- }
83
-
84
- /**
85
- * External integration E2E: run, display, exit on aggregate, optional cert sync.
60
+ * External integration E2E: run, display, exit on aggregate.
86
61
  * @param {string} appName
87
62
  * @param {Object} options
88
63
  * @returns {Promise<void>}
89
64
  */
90
- async function runExternalIntegrationE2EAndCertSync(appName, options, cmd) {
91
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
65
+ async function runExternalIntegrationE2EAndExit(appName, options, cmd) {
66
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
92
67
  const { runTestE2EForExternalSystem } = require('../commands/test-e2e-external');
93
- const noSync = cliOptsSkipSync(options, cmd);
68
+ const noPublish = cliOptsSkipPublish(options, cmd);
94
69
  const { success, results } = await runTestE2EForExternalSystem(appName, {
95
70
  env: options.env,
96
71
  debug: options.debug,
97
72
  verbose: options.verbose,
98
73
  async: options.async !== false,
99
- noSync
74
+ noPublish,
75
+ syncMode: options.syncMode
100
76
  });
101
77
  const { displayIntegrationTestResults } = require('../utils/external-system-display');
102
78
  const datasourceResults = results.map(r => ({
@@ -117,25 +93,21 @@ async function runExternalIntegrationE2EAndCertSync(appName, options, cmd) {
117
93
  requireCert: options.requireCert === true
118
94
  });
119
95
  if (exitCode !== 0) process.exit(exitCode);
120
- if (cliOptsSkipCertSync(options)) return;
121
- const { trySyncCertificationFromDataplaneForExternalApp } = require('../certification/sync-after-external-command');
122
- const issuanceFailureHint = firstIssuanceFailureHintFromE2eResults(results);
123
- await trySyncCertificationFromDataplaneForExternalApp(appName, 'test-e2e', { issuanceFailureHint });
124
96
  }
125
97
 
126
98
  async function runTestE2ECommand(appName, options, cmd) {
127
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
128
- const noSync = cliOptsSkipSync(options, cmd);
99
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
100
+ const noPublish = cliOptsSkipPublish(options, cmd);
129
101
  const pathsUtil = require('../utils/paths');
130
102
  const appType = await pathsUtil.detectAppType(appName).catch(() => null);
131
- if (noSync && appType && appType.baseDir === 'builder') {
103
+ if (noPublish && appType && appType.baseDir === 'builder') {
132
104
  throw new Error(
133
- 'Option --no-sync applies only to external integration E2E (integration/<systemKey>/). ' +
134
- 'Remove --no-sync for builder app E2E.'
105
+ 'Option --no-publish applies only to external integration E2E (integration/<systemKey>/). ' +
106
+ 'Remove --no-publish for builder app E2E.'
135
107
  );
136
108
  }
137
109
  if (appType && appType.baseDir === 'integration') {
138
- await runExternalIntegrationE2EAndCertSync(appName, options, cmd);
110
+ await runExternalIntegrationE2EAndExit(appName, options, cmd);
139
111
  return;
140
112
  }
141
113
  const { runAppTestE2e } = require('../commands/app-test');
@@ -170,21 +142,24 @@ function setupTestE2eCommand(program) {
170
142
  .description('E2E: builder appKey in container; external systemKey = all datasources via dataplane')
171
143
  .option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
172
144
  .option('-v, --verbose', 'Show detailed step output and poll progress')
173
- .option('-d, --debug', 'Include debug output and write log to integration/<systemKey>/logs/')
174
- .option(
175
- '--no-sync',
176
- 'Skip publishing local integration files; E2E uses the system config already on the dataplane (external integration only)'
177
- )
145
+ .option('-d, --debug', 'Certification debug + log to integration/<systemKey>/logs/')
146
+ .option('--no-publish', 'Skip publishing local integration files before E2E')
178
147
  .option(
179
148
  '--force',
180
149
  'With default sync, pass force to upload (bypass active-datasource schema replacement guards; same as aifabrix upload --force)'
181
150
  )
182
- .option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
183
- .option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
184
151
  .option(
185
- '--no-cert-sync',
186
- 'Skip updating the system file certification block from the dataplane after a successful run'
152
+ '--version <target>',
153
+ 'Manifest version for E2E (latest, running, or explicit version id)',
154
+ 'latest'
187
155
  )
156
+ .option(
157
+ '--sync-mode <mode>',
158
+ 'Sync policy during E2E: auto (default), never, or force. Distinct from default pre-run publish.',
159
+ 'auto'
160
+ )
161
+ .option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
162
+ .option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
188
163
  .addHelpText('after', TEST_E2E_HELP_AFTER)
189
164
  .action(async(appName, options, cmd) => {
190
165
  try {
@@ -232,7 +207,6 @@ function setupInstallTestE2eLintCommands(program) {
232
207
  }
233
208
 
234
209
  module.exports = {
235
- setupInstallTestE2eLintCommands,
236
- firstIssuanceFailureHintFromE2eResults
210
+ setupInstallTestE2eLintCommands
237
211
  };
238
212