@aifabrix/builder 2.49.2 → 2.50.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 (409) hide show
  1. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  2. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  3. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  4. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  5. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  6. package/.cursor/skills/README.md +1 -0
  7. package/.dockerignore +52 -0
  8. package/.eslintignore +22 -0
  9. package/README.md +2 -0
  10. package/bin/builder-api-cleanup.js +26 -0
  11. package/bin/builder-api-nest.js +10 -0
  12. package/bin/builder-api-spike.js +19 -0
  13. package/enterprise-knowledge/README.md +50 -0
  14. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  20. package/integration/README.md +81 -0
  21. package/integration/github/README.md +53 -0
  22. package/integration/github/application.json +21 -0
  23. package/integration/github/deploy.js +72 -0
  24. package/integration/github/env.template +11 -0
  25. package/integration/github/github-datasource-issue-comments.json +239 -0
  26. package/integration/github/github-datasource-issues.json +399 -0
  27. package/integration/github/github-datasource-repository.json +354 -0
  28. package/integration/github/github-deploy.json +1202 -0
  29. package/integration/github/github-system.json +82 -0
  30. package/integration/hubspot-test/README.md +1 -1
  31. package/jest.isolated-projects.js +31 -1
  32. package/jest.projects.js +87 -1
  33. package/lib/api/dev-server-https.js +1 -1
  34. package/lib/api/enterprise-knowledge.api.js +63 -0
  35. package/lib/api/evidence.api.js +172 -0
  36. package/lib/api/external-systems.api.js +8 -2
  37. package/lib/api/resource-types.api.js +1 -0
  38. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  39. package/lib/api/types/evidence.types.js +67 -0
  40. package/lib/api/types/resource-types.types.js +2 -0
  41. package/lib/app/controller-application-filter.js +36 -0
  42. package/lib/app/deploy.js +1 -1
  43. package/lib/app/list-external-systems.js +130 -0
  44. package/lib/app/list.js +20 -8
  45. package/lib/app/run.js +3 -1
  46. package/lib/app/show-display.js +8 -3
  47. package/lib/app/show-online.js +178 -0
  48. package/lib/app/show.js +37 -88
  49. package/lib/build/builder-api-docker-staging.js +47 -0
  50. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  51. package/lib/build/standard-docker-build.js +2 -0
  52. package/lib/certification/post-unified-cert-sync.js +4 -31
  53. package/lib/certification/sync-after-external-command.js +0 -1
  54. package/lib/certification/sync-system-certification.js +0 -3
  55. package/lib/channels/add-channel.js +40 -34
  56. package/lib/channels/approval-guides/chatgpt.js +33 -0
  57. package/lib/channels/approval-guides/credential-portal.js +38 -0
  58. package/lib/channels/approval-guides/index.js +110 -0
  59. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  60. package/lib/channels/approval-guides/slack.js +34 -0
  61. package/lib/channels/approval-guides/teams-bot.js +35 -0
  62. package/lib/channels/approval-guides/web-embed.js +32 -0
  63. package/lib/channels/channel-approval-guide.js +11 -0
  64. package/lib/channels/channel-artifact-generator.js +16 -4
  65. package/lib/channels/channel-audit.js +3 -0
  66. package/lib/channels/channel-auth-context.js +1 -1
  67. package/lib/channels/channel-description.js +59 -0
  68. package/lib/channels/channel-integration-generator.js +13 -230
  69. package/lib/channels/channel-integration-template.js +94 -0
  70. package/lib/channels/channel-runtime-resolver.js +43 -3
  71. package/lib/channels/channel-status-display.js +66 -26
  72. package/lib/channels/channel-targets.js +3 -3
  73. package/lib/cli/index.js +27 -3
  74. package/lib/cli/infra-guided.js +5 -1
  75. package/lib/cli/setup-app-external-create.js +111 -0
  76. package/lib/cli/setup-app.help.js +1 -1
  77. package/lib/cli/setup-app.js +38 -125
  78. package/lib/cli/setup-app.test-commands.js +26 -52
  79. package/lib/cli/setup-certification-commands.js +4 -4
  80. package/lib/cli/setup-certification.help.js +9 -9
  81. package/lib/cli/setup-dev.js +7 -2
  82. package/lib/cli/setup-external-system-help.js +4 -6
  83. package/lib/cli/setup-external-system.js +58 -52
  84. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  85. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  86. package/lib/cli/setup-infra.js +15 -0
  87. package/lib/cli/setup-list.js +43 -0
  88. package/lib/cli/setup-utility-repair.js +26 -7
  89. package/lib/cli/setup-utility.js +5 -3
  90. package/lib/commands/app.js +15 -43
  91. package/lib/commands/channel-add-setup.js +110 -0
  92. package/lib/commands/channel.js +42 -8
  93. package/lib/commands/datasource-sync-display.js +96 -0
  94. package/lib/commands/datasource-sync-policy.js +210 -0
  95. package/lib/commands/datasource-test-trust-cli.js +6 -6
  96. package/lib/commands/datasource-unified-test-cli.js +2 -1
  97. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  98. package/lib/commands/deploy-gate-failure-details.js +163 -0
  99. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  100. package/lib/commands/dev-cli-handlers.js +1 -59
  101. package/lib/commands/dev-host-ops-params.js +91 -0
  102. package/lib/commands/dev-host-ops-poll.js +111 -0
  103. package/lib/commands/dev-host-ops.js +107 -94
  104. package/lib/commands/dev-init.js +3 -1
  105. package/lib/commands/enterprise-knowledge.js +284 -0
  106. package/lib/commands/evidence-cli-leaves.js +250 -0
  107. package/lib/commands/evidence.js +51 -0
  108. package/lib/commands/governance-cli-shared.js +2 -2
  109. package/lib/commands/governance-command-action.js +2 -2
  110. package/lib/commands/governance-fixture-subjects.js +85 -0
  111. package/lib/commands/governance.js +1 -1
  112. package/lib/commands/lifecycle-command-action.js +2 -2
  113. package/lib/commands/lifecycle-external.js +3 -3
  114. package/lib/commands/manifest-cli-auth.js +29 -0
  115. package/lib/commands/manifest-cli-commands.js +170 -0
  116. package/lib/commands/manifest-cli-integration-path.js +63 -0
  117. package/lib/commands/manifest.js +21 -0
  118. package/lib/commands/protection-cli-leaves.js +3 -3
  119. package/lib/commands/repair-auth-apply.js +15 -1
  120. package/lib/commands/repair-authentications-454.js +169 -0
  121. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  122. package/lib/commands/repair-datasource-apply.js +135 -0
  123. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  124. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  125. package/lib/commands/repair-datasource-operation-security.js +180 -0
  126. package/lib/commands/repair-datasource-run.js +7 -2
  127. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  128. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  129. package/lib/commands/repair-datasource.js +12 -68
  130. package/lib/commands/repair-env-template.js +11 -1
  131. package/lib/commands/repair-external-run.js +121 -31
  132. package/lib/commands/repair-internal.js +1 -1
  133. package/lib/commands/repair-openapi-export.js +156 -0
  134. package/lib/commands/repair-openapi-sync.js +19 -2
  135. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  136. package/lib/commands/repair-persist.js +22 -1
  137. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  138. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  139. package/lib/commands/repair-rbac.js +163 -86
  140. package/lib/commands/repair-steps.js +83 -18
  141. package/lib/commands/repair-system-permissions.js +1 -0
  142. package/lib/commands/repair.js +1 -1
  143. package/lib/commands/resource-type.js +65 -26
  144. package/lib/commands/run-post-publish-data-sync.js +68 -0
  145. package/lib/commands/setup-modes.js +1 -1
  146. package/lib/commands/test-e2e-external.js +21 -8
  147. package/lib/commands/test-governance-cli-options.js +2 -2
  148. package/lib/commands/test-trust-cli-options.js +2 -2
  149. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  150. package/lib/commands/up-builder-api-provision.js +241 -0
  151. package/lib/commands/up-builder-api.js +88 -0
  152. package/lib/commands/up-common.js +25 -1
  153. package/lib/commands/upload-credential-push-log.js +117 -0
  154. package/lib/commands/upload-data-sync-finalize.js +60 -0
  155. package/lib/commands/upload-probe.js +66 -0
  156. package/lib/commands/upload-publish-context.js +4 -1
  157. package/lib/commands/upload-sidecar-followups.js +55 -27
  158. package/lib/commands/upload.js +116 -157
  159. package/lib/commands/verify-governance-combined-external.js +1 -1
  160. package/lib/commands/verify-governance-db.js +2 -2
  161. package/lib/commands/verify-operations-command-action.js +2 -2
  162. package/lib/commands/verify-operations-step-plan.js +2 -2
  163. package/lib/commands/verify-operations-steps.js +2 -2
  164. package/lib/commands/verify-trust-command-action.js +1 -1
  165. package/lib/commands/wizard-core.js +1 -1
  166. package/lib/commands/wizard-headless.js +2 -1
  167. package/lib/core/admin-secrets.js +2 -6
  168. package/lib/core/secrets-env-content.js +10 -4
  169. package/lib/core/secrets-env-write.js +2 -13
  170. package/lib/datasource/agent-trust-run.js +3 -3
  171. package/lib/datasource/deploy.js +3 -1
  172. package/lib/datasource/test-e2e.js +6 -1
  173. package/lib/datasource/unified-validation-run-body.js +4 -1
  174. package/lib/datasource/unified-validation-run.js +1 -1
  175. package/lib/deployment/deploy-poll-ui.js +73 -12
  176. package/lib/deployment/deployer-poll-run.js +113 -0
  177. package/lib/deployment/deployer.js +17 -87
  178. package/lib/evidence/dataplane-context.js +21 -0
  179. package/lib/evidence/evidence-display.js +78 -0
  180. package/lib/evidence/evidence-service.js +392 -0
  181. package/lib/external-system/deploy.js +290 -112
  182. package/lib/external-system/download.js +7 -3
  183. package/lib/external-system/test-execution.js +1 -1
  184. package/lib/external-system/test-system-level.js +8 -10
  185. package/lib/external-system/test.js +12 -6
  186. package/lib/generator/deploy-script.js +73 -0
  187. package/lib/generator/external.js +2 -1
  188. package/lib/generator/index.js +17 -2
  189. package/lib/generator/wizard.js +3 -36
  190. package/lib/internal/fs-real-sync.js +22 -1
  191. package/lib/internal/node-fs.js +2 -0
  192. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  193. package/lib/lifecycle/verify-step-progress.js +1 -1
  194. package/lib/programmatic/access-log.js +26 -0
  195. package/lib/programmatic/auth-config.js +44 -0
  196. package/lib/programmatic/bearer-auth.js +176 -0
  197. package/lib/programmatic/builder-api-request.js +175 -0
  198. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  199. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  200. package/lib/programmatic/builder-api-server.js +230 -0
  201. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  202. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  203. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  204. package/lib/programmatic/builder-help-envelope.js +36 -0
  205. package/lib/programmatic/builder-help-fixtures.js +200 -0
  206. package/lib/programmatic/builder-help-governance.js +172 -0
  207. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  208. package/lib/programmatic/builder-help.js +361 -0
  209. package/lib/programmatic/capability-registry.js +77 -0
  210. package/lib/programmatic/command-options.js +32 -0
  211. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  212. package/lib/programmatic/http-problem-details.js +99 -0
  213. package/lib/programmatic/http-route-match.js +40 -0
  214. package/lib/programmatic/idempotency-cache.js +69 -0
  215. package/lib/programmatic/index.js +53 -0
  216. package/lib/programmatic/integration-path-scope.js +39 -0
  217. package/lib/programmatic/log-redaction.js +66 -0
  218. package/lib/programmatic/manifest-get-section.js +146 -0
  219. package/lib/programmatic/manifest-patch-section.js +252 -0
  220. package/lib/programmatic/manifest-repair.js +122 -0
  221. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  222. package/lib/programmatic/manifest-section-io.js +225 -0
  223. package/lib/programmatic/manifest-section-quality.js +171 -0
  224. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  225. package/lib/programmatic/manifest-section-registry.js +205 -0
  226. package/lib/programmatic/nest-http-bridge.js +34 -0
  227. package/lib/programmatic/openapi-component-schemas.js +68 -0
  228. package/lib/programmatic/openapi-description-enricher.js +117 -0
  229. package/lib/programmatic/openapi-descriptions.js +190 -0
  230. package/lib/programmatic/openapi-docs-serving.js +123 -0
  231. package/lib/programmatic/openapi-help-schemas.js +63 -0
  232. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  233. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  234. package/lib/programmatic/openapi-request-schemas.js +155 -0
  235. package/lib/programmatic/openapi-result-schemas.js +476 -0
  236. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  237. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  238. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  239. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  240. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  241. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  242. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  243. package/lib/programmatic/openapi-spec.js +203 -0
  244. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  245. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  246. package/lib/programmatic/request-timeout.js +53 -0
  247. package/lib/programmatic/route-handler-map.js +143 -0
  248. package/lib/programmatic/route-handlers-context.js +29 -0
  249. package/lib/programmatic/route-handlers.js +33 -0
  250. package/lib/programmatic/run-certify.js +57 -0
  251. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  252. package/lib/programmatic/run-lifecycle.js +29 -0
  253. package/lib/programmatic/run-repair.js +41 -0
  254. package/lib/programmatic/run-repository-emcp.js +54 -0
  255. package/lib/programmatic/run-template-workspace.js +61 -0
  256. package/lib/programmatic/run-test.js +49 -0
  257. package/lib/programmatic/run-upload.js +63 -0
  258. package/lib/programmatic/run-validate.js +53 -0
  259. package/lib/programmatic/run-wizard.js +40 -0
  260. package/lib/programmatic/system-key.js +48 -0
  261. package/lib/programmatic/wizard-config-normalize.js +118 -0
  262. package/lib/programmatic/workspace-cleanup.js +128 -0
  263. package/lib/programmatic/workspace-context.js +145 -0
  264. package/lib/programmatic/workspace-lock.js +75 -0
  265. package/lib/programmatic/workspace-meta.js +64 -0
  266. package/lib/programmatic/workspace-ops.js +149 -0
  267. package/lib/protection/run-commands-upload-sync.js +35 -0
  268. package/lib/protection/run-commands.js +2 -20
  269. package/lib/protection/upload-batch.js +11 -7
  270. package/lib/resolvers/resource-type-file.js +22 -0
  271. package/lib/schema/external-datasource.schema.json +161 -1
  272. package/lib/schema/external-system.schema.json +244 -118
  273. package/lib/schema/flag-map-validation-run.json +3 -0
  274. package/lib/schema/type/credential-field-registry.json +2 -2
  275. package/lib/schema/type/document-storage.json +9 -0
  276. package/lib/utils/agent-trust-run-display.js +1 -1
  277. package/lib/utils/app-path-resolve.js +168 -0
  278. package/lib/utils/authentication-env-template.js +222 -0
  279. package/lib/utils/cli-sync-options.js +7 -11
  280. package/lib/utils/cli-utils.js +4 -0
  281. package/lib/utils/cli-workspace-options.js +29 -0
  282. package/lib/utils/compose-generate-docker-compose.js +102 -0
  283. package/lib/utils/configuration-env-resolver.js +203 -27
  284. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  285. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  286. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  287. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  288. package/lib/utils/datasource-test-run-display.js +2 -1
  289. package/lib/utils/dev-init-ssh-merge.js +165 -23
  290. package/lib/utils/dev-pin-share-instructions.js +110 -0
  291. package/lib/utils/dev-ssh-config-helper.js +177 -33
  292. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  293. package/lib/utils/env-copy.js +2 -1
  294. package/lib/utils/env-dotenv-format.js +103 -0
  295. package/lib/utils/external-env-template.js +4 -1
  296. package/lib/utils/external-system-display.js +5 -1
  297. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  298. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  299. package/lib/utils/external-system-readiness-core.js +16 -0
  300. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  301. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  302. package/lib/utils/external-system-readiness-display.js +20 -30
  303. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  304. package/lib/utils/external-system-system-test-tty.js +5 -41
  305. package/lib/utils/help-builder.js +6 -1
  306. package/lib/utils/host-ops-job-labels.js +236 -0
  307. package/lib/utils/host-ops-job-result.js +61 -0
  308. package/lib/utils/host-ops-poll-ui.js +163 -0
  309. package/lib/utils/integration-path-resolve.js +112 -0
  310. package/lib/utils/paths-reload-source.js +148 -0
  311. package/lib/utils/paths-system-builder-keys.js +25 -0
  312. package/lib/utils/paths.js +151 -26
  313. package/lib/utils/runtime-configuration-values.js +64 -2
  314. package/lib/utils/secrets-helpers.js +5 -1
  315. package/lib/utils/ssh-known-hosts.js +130 -0
  316. package/lib/utils/test-target-cli-options.js +75 -0
  317. package/lib/utils/upload-sync-options.js +4 -0
  318. package/lib/utils/validation-run-request.js +11 -2
  319. package/lib/validation/external-manifest-validator.js +11 -1
  320. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  321. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  322. package/lib/validation/validate-external-file.js +160 -0
  323. package/lib/validation/validate.js +6 -117
  324. package/package.json +46 -29
  325. package/packages/builder-api/README.md +120 -0
  326. package/packages/builder-api/package.json +30 -0
  327. package/packages/builder-api/src/app.module.ts +7 -0
  328. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  329. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  330. package/packages/builder-api/src/main.ts +16 -0
  331. package/packages/builder-api/tsconfig.json +15 -0
  332. package/scripts/check-builder-api-architecture-grep.js +79 -0
  333. package/scripts/docker_image_content_gate.js +47 -0
  334. package/scripts/docker_image_content_gate.sh +5 -0
  335. package/scripts/export-builder-api-evidence.js +262 -0
  336. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  337. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  338. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  339. package/scripts/lib/plan-actor.js +109 -0
  340. package/scripts/lib/plan-config.js +20 -0
  341. package/scripts/lib/plan-gates.js +154 -0
  342. package/scripts/lib/plan-meta.js +104 -0
  343. package/scripts/lib/plan-parse.js +162 -0
  344. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  345. package/scripts/lib/plan-run-core.js +125 -0
  346. package/scripts/lib/plan-run-report.js +108 -0
  347. package/scripts/plan-approve.js +24 -0
  348. package/scripts/plan-archive.js +49 -0
  349. package/scripts/plan-run.js +13 -0
  350. package/scripts/plan-set-actor.js +21 -0
  351. package/scripts/plan-validate.js +80 -0
  352. package/scripts/pnpm/af.mjs +110 -0
  353. package/scripts/pnpm/check-quiet.mjs +32 -0
  354. package/scripts/pnpm/dev-install.mjs +29 -0
  355. package/scripts/pnpm/dev-reload.mjs +18 -0
  356. package/scripts/pnpm/help.mjs +55 -0
  357. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  358. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  359. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  360. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  361. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  362. package/scripts/pnpm/lib/spinner.mjs +42 -0
  363. package/scripts/stage_builder_api_for_docker.js +65 -0
  364. package/scripts/sync-builder-api-template.js +44 -0
  365. package/templates/README.md +3 -0
  366. package/templates/applications/builder-api/Dockerfile +38 -0
  367. package/templates/applications/builder-api/application.yaml +75 -0
  368. package/templates/applications/builder-api/env.template +48 -0
  369. package/templates/applications/dataplane/application.yaml +1 -1
  370. package/templates/applications/dataplane/env.template +10 -6
  371. package/templates/applications/dataplane/rbac.yaml +21 -1
  372. package/templates/applications/miso-controller/application.yaml +1 -1
  373. package/templates/applications/miso-controller/env.template +1 -3
  374. package/templates/channels/README.md +18 -0
  375. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  376. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  377. package/templates/channels/chatgpt/integration/README.md +11 -0
  378. package/templates/channels/chatgpt/integration/application.json +15 -0
  379. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  380. package/templates/channels/chatgpt/integration/env.template +4 -0
  381. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  382. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  383. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  384. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  385. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  386. package/templates/channels/slack/install.template.md.hbs +48 -18
  387. package/templates/channels/slack/integration/README.md +38 -0
  388. package/templates/channels/slack/integration/application.json +18 -0
  389. package/templates/channels/slack/integration/env.template +29 -0
  390. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  391. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  392. package/templates/channels/slack/integration/slack-system.json +86 -0
  393. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  394. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  395. package/templates/channels/teams-bot/integration/README.md +18 -0
  396. package/templates/channels/teams-bot/integration/application.json +17 -0
  397. package/templates/channels/teams-bot/integration/env.template +5 -0
  398. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  399. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  400. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  401. package/templates/channels/web-embed/integration/README.md +11 -0
  402. package/templates/channels/web-embed/integration/application.json +15 -0
  403. package/templates/channels/web-embed/integration/env.template +4 -0
  404. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  405. package/templates/openapi/redoc_page.html +86 -0
  406. package/templates/python/docker-compose.hbs +11 -0
  407. package/templates/python/requirements.txt +1 -1
  408. package/templates/typescript/docker-compose.hbs +11 -0
  409. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -1,5 +1,5 @@
1
1
  /**
2
- * TTY output for app add-channel (plan 152).
2
+ * TTY output for channel add (plan 152).
3
3
  *
4
4
  * @fileoverview Channel install status display — customer language: Assistant
5
5
  * @author AI Fabrix Team
@@ -26,32 +26,79 @@ function separatorLine() {
26
26
  : '────────────────────────────────────────';
27
27
  }
28
28
 
29
+ /**
30
+ * @param {Object|null} approvalGuide
31
+ */
32
+ function displayApprovalGuideOptionalLinks(approvalGuide) {
33
+ if (approvalGuide.artifactPath) {
34
+ logger.log('');
35
+ logger.log(metadata('Manifest file:'));
36
+ logger.log(chalk.white(approvalGuide.artifactPath));
37
+ }
38
+ if (approvalGuide.credentialPortalUrl) {
39
+ logger.log('');
40
+ logger.log(metadata('AI Fabrix authentication:'));
41
+ logger.log(chalk.cyan(approvalGuide.credentialPortalUrl));
42
+ }
43
+ if (approvalGuide.installGuidePath) {
44
+ logger.log('');
45
+ logger.log(metadata(`Full guide: ${approvalGuide.installGuidePath}`));
46
+ }
47
+ }
48
+
49
+ /**
50
+ * @param {Object|null} approvalGuide
51
+ */
52
+ function displayApprovalGuideSection(approvalGuide) {
53
+ if (!approvalGuide?.steps?.length) return;
54
+ logger.log('');
55
+ const heading =
56
+ approvalGuide.approvalRequired === false
57
+ ? 'Go-live steps'
58
+ : 'Platform admin approval required';
59
+ logger.log(formatWarningLine(heading));
60
+ if (approvalGuide.portalUrl) {
61
+ logger.log(metadata('Admin console:'));
62
+ logger.log(chalk.cyan(approvalGuide.portalUrl));
63
+ }
64
+ logger.log('');
65
+ logger.log(metadata('Next steps:'));
66
+ approvalGuide.steps.forEach((step, index) => {
67
+ logger.log(chalk.white(` ${index + 1}. ${step}`));
68
+ });
69
+ displayApprovalGuideOptionalLinks(approvalGuide);
70
+ }
71
+
29
72
  /**
30
73
  * @param {Object} params
31
74
  * @param {string} params.channelTarget
32
75
  * @param {string} params.name
33
76
  * @param {Object|null} params.channelExt
34
- * @param {string} [params.approvalUrl]
77
+ * @param {Object|null} [params.approvalGuide]
35
78
  */
36
79
  function displayExistingChannelStatus(params) {
37
- logger.log(sectionTitle(`${params.channelTarget} channel: ${params.name}`));
38
- logger.log('');
39
- logger.log(metadata(`Status: ${params.channelExt?.status || 'unknown'}`));
40
- if (params.channelExt?.baseName && params.channelExt.baseName !== params.name) {
41
- logger.log(metadata(`Base name: ${params.channelExt.baseName}`));
42
- }
43
- logger.log(metadata(`External System: ${params.channelTarget}`));
44
- logger.log(metadata(`Credential: ${params.channelExt?.credentialKey || '—'}`));
45
- if (params.channelExt?.capabilities?.length) {
46
- logger.log(metadata('Capabilities:'));
47
- for (const cap of params.channelExt.capabilities) {
48
- logger.log(` - ${cap}`);
49
- }
80
+ const status = params.channelExt?.status || 'unknown';
81
+ displayChannelCoreFields({
82
+ channelTarget: params.channelTarget,
83
+ name: params.name,
84
+ statusLabel: status,
85
+ baseName: params.channelExt?.baseName,
86
+ credentialKey: params.channelExt?.credentialKey,
87
+ capabilities: params.channelExt?.capabilities
88
+ });
89
+
90
+ if (status === 'approvalRequired' && params.approvalGuide) {
91
+ displayApprovalGuideSection(params.approvalGuide);
92
+ logger.log(separatorLine());
93
+ return;
50
94
  }
95
+
51
96
  logger.log('');
52
- logger.log(formatWarningLine('Channel install already configured. Use --force to regenerate artifacts.'));
53
- if (params.approvalUrl) {
54
- logger.log(metadata(`Approval URL: ${params.approvalUrl}`));
97
+ if (status === 'installed' || status === 'validated') {
98
+ logger.log(formatSuccessLine('Channel install is complete.'));
99
+ logger.log(metadata('Use --force to regenerate artifacts and patch config.'));
100
+ } else {
101
+ logger.log(formatWarningLine('Channel install already configured. Use --force to regenerate artifacts.'));
55
102
  }
56
103
  logger.log(separatorLine());
57
104
  }
@@ -107,14 +154,7 @@ function displayValidationSection(validation) {
107
154
  * @param {Object} result
108
155
  */
109
156
  function displayApprovalSection(result) {
110
- if (!result.approvalUrl) return;
111
- logger.log('');
112
- logger.log(formatWarningLine('Approval required'));
113
- logger.log(metadata('Open this URL as platform admin:'));
114
- logger.log(chalk.cyan(result.approvalUrl));
115
- logger.log('');
116
- logger.log(metadata('After approval, run:'));
117
- logger.log(chalk.white(` aifabrix app add-channel ${result.channelTarget} --name "${result.name}"`));
157
+ displayApprovalGuideSection(result.approvalGuide);
118
158
  }
119
159
 
120
160
  /**
@@ -10,7 +10,7 @@
10
10
 
11
11
  /** @typedef {'teams-bot'|'slack'|'microsoft-copilot'|'chatgpt'|'web-embed'} ChannelTargetKey */
12
12
 
13
- const DEFAULT_CAPABILITIES = ['chat', 'notify'];
13
+ const DEFAULT_CAPABILITIES = ['chat', 'notify', 'documentApproval'];
14
14
 
15
15
  const CHANNEL_TARGETS = {
16
16
  'teams-bot': {
@@ -101,8 +101,8 @@ function getChannelTarget(channelTarget) {
101
101
  */
102
102
  function getDefaultChannelDescription() {
103
103
  return (
104
- 'Enterprise AI assistant for employees. Provides access to approved assistants, ' +
105
- 'enterprise knowledge, business workflows, and governed actions through AI Fabrix.'
104
+ 'Enterprise AI assistant for employees. Approved assistants, enterprise knowledge, ' +
105
+ 'workflows, and governed actions via AI Fabrix.'
106
106
  );
107
107
  }
108
108
 
package/lib/cli/index.js CHANGED
@@ -23,15 +23,19 @@ 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 { setupEnterpriseKnowledgeCommands } = require('../commands/enterprise-knowledge');
26
27
  const { setupIdentityCommands } = require('../commands/identity');
27
28
  const { setupProtectionCommands } = require('../commands/protection');
29
+ const { setupEvidenceCommands } = require('../commands/evidence');
28
30
  const { setupCredentialDeploymentCommands } = require('./setup-credential-deployment');
29
31
  const { setupIntegrationClientCommands } = require('./setup-integration-client');
30
32
  const { setupPlatformCommands } = require('./setup-platform');
31
33
  const { setupCertificationCommands } = require('./setup-certification-commands');
32
34
  const { setupGovernanceCommands } = require('../commands/governance');
33
35
  const { setupChannelCommands } = require('../commands/channel');
36
+ const { setupManifestCommands } = require('../commands/manifest');
34
37
  const { setupNpmCommands } = require('./setup-npm');
38
+ const { setupListCommand } = require('./setup-list');
35
39
 
36
40
  /**
37
41
  * Dev, secrets, parameters, and platform commands (keeps setupCommands under statement limit).
@@ -46,10 +50,10 @@ function setupDevAndPlatformCommands(program) {
46
50
  }
47
51
 
48
52
  /**
49
- * Sets up all CLI commands on the Commander program instance
50
- * @param {Command} program - Commander program instance
53
+ * Core platform and integration CLI command groups.
54
+ * @param {import('commander').Command} program
51
55
  */
52
- function setupCommands(program) {
56
+ function setupCoreCliCommands(program) {
53
57
  setupInfraCommands(program);
54
58
  setupAuthCommands(program);
55
59
  setupAppCommands(program);
@@ -59,14 +63,34 @@ function setupCommands(program) {
59
63
  setupAppManagementCommands(program);
60
64
  setupChannelCommands(program);
61
65
  setupDatasourceCommands(program);
66
+ setupManifestCommands(program);
67
+ }
68
+
69
+ /**
70
+ * Extended catalog and policy CLI command groups.
71
+ * @param {import('commander').Command} program
72
+ */
73
+ function setupExtendedCliCommands(program) {
62
74
  setupDimensionCommands(program);
63
75
  setupResourceTypeCommands(program);
76
+ setupEnterpriseKnowledgeCommands(program);
64
77
  setupIdentityCommands(program);
65
78
  setupProtectionCommands(program);
79
+ setupEvidenceCommands(program);
66
80
  setupUtilityCommands(program);
81
+ setupListCommand(program);
67
82
  setupCredentialDeploymentCommands(program);
68
83
  setupIntegrationClientCommands(program);
69
84
  setupExternalSystemCommands(program);
85
+ }
86
+
87
+ /**
88
+ * Sets up all CLI commands on the Commander program instance
89
+ * @param {Command} program - Commander program instance
90
+ */
91
+ function setupCommands(program) {
92
+ setupCoreCliCommands(program);
93
+ setupExtendedCliCommands(program);
70
94
  setupDevAndPlatformCommands(program);
71
95
  }
72
96
 
@@ -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,13 +50,13 @@ 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).
@@ -79,106 +83,6 @@ Notes:
79
83
  - Use -t 0 (--tail 0) for the full buffered log; default is 100 lines.
80
84
  `;
81
85
 
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
86
  /**
183
87
  * Handle create command execution
184
88
  * @async
@@ -419,21 +323,7 @@ function setupDockerfileGenerateCommand(program) {
419
323
  });
420
324
  }
421
325
 
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
-
326
+ function setupDeployCommand(program) {
437
327
  program.command('deploy <appKey|systemKey>')
438
328
  .description('Deploy builder app or external system via Miso Controller (Azure or --local)')
439
329
  .addHelpText('after', DEPLOY_HELP_AFTER)
@@ -441,13 +331,20 @@ function setupPushDeployDockerfileCommands(program) {
441
331
  .option('--client-id <id>', 'Client ID (overrides config)')
442
332
  .option('--client-secret <secret>', 'Client Secret (overrides config)')
443
333
  .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')
334
+ .option('-v, --verbose', 'Expanded deploy summary and preflight progress')
446
335
  .option('--probe', 'After external deploy, run dataplane runtime checks (validation/run); slower')
447
336
  .option('--probe-timeout <ms>', 'Timeout for --probe on external deploy (default: 120000)', '120000')
448
337
  .option(
449
- '--no-cert-sync',
450
- 'Skip updating integration certification in the system file from the dataplane after external deploy'
338
+ '--sync',
339
+ 'After deploy, run full datasource data sync for every datasource on the system (default: bootstrap-if-empty only)'
340
+ )
341
+ .option(
342
+ '--gate <gates>',
343
+ 'Optional pre-promote gates (comma-separated): operations, trust, governance, full'
344
+ )
345
+ .option(
346
+ '--subject-email <emails>',
347
+ 'Subject email(s) for governance gate (comma-separated; used with --gate governance|full)'
451
348
  )
452
349
  .action(async(appName, options) => {
453
350
  try {
@@ -458,6 +355,7 @@ function setupPushDeployDockerfileCommands(program) {
458
355
  const opts = {
459
356
  ...options,
460
357
  local: !!options.local,
358
+ verbose: options.verbose === true,
461
359
  probeTimeout: Number.isFinite(probeTimeout) ? probeTimeout : 120000
462
360
  };
463
361
  const outcome = await app.deployApp(appName, opts);
@@ -470,7 +368,24 @@ function setupPushDeployDockerfileCommands(program) {
470
368
  process.exit(1);
471
369
  }
472
370
  });
371
+ }
473
372
 
373
+ function setupPushDeployDockerfileCommands(program) {
374
+ program.command('push <appKey>')
375
+ .description('Push builder appKey image to Azure Container Registry')
376
+ .addHelpText('after', PUSH_HELP_AFTER)
377
+ .option('-r, --registry <registry>', 'ACR registry URL (overrides application.yaml)')
378
+ .option('-t, --tag <tag>', 'Image tag(s) - comma-separated for multiple (default: latest)')
379
+ .action(async(appName, options) => {
380
+ try {
381
+ await app.pushApp(appName, options);
382
+ } catch (error) {
383
+ handleCommandError(error, 'push');
384
+ process.exit(1);
385
+ }
386
+ });
387
+
388
+ setupDeployCommand(program);
474
389
  setupDockerfileGenerateCommand(program);
475
390
  }
476
391
 
@@ -489,7 +404,5 @@ function setupAppCommands(program) {
489
404
 
490
405
  module.exports = {
491
406
  setupAppCommands,
492
- normalizeExternalOptions,
493
- prepareExternalCreateOptions,
494
- validateNonInteractiveExternalOptions
407
+ ...require('./setup-app-external-create')
495
408
  };