@aifabrix/builder 2.49.1 → 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 (413) hide show
  1. package/.cursor/process/README.md +9 -0
  2. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  3. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  4. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  5. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  6. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  7. package/.cursor/skills/README.md +1 -0
  8. package/.dockerignore +52 -0
  9. package/.eslintignore +22 -0
  10. package/README.md +2 -0
  11. package/bin/builder-api-cleanup.js +26 -0
  12. package/bin/builder-api-nest.js +10 -0
  13. package/bin/builder-api-spike.js +19 -0
  14. package/enterprise-knowledge/README.md +50 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  21. package/integration/README.md +81 -0
  22. package/integration/github/README.md +53 -0
  23. package/integration/github/application.json +21 -0
  24. package/integration/github/deploy.js +72 -0
  25. package/integration/github/env.template +11 -0
  26. package/integration/github/github-datasource-issue-comments.json +239 -0
  27. package/integration/github/github-datasource-issues.json +399 -0
  28. package/integration/github/github-datasource-repository.json +354 -0
  29. package/integration/github/github-deploy.json +1202 -0
  30. package/integration/github/github-system.json +82 -0
  31. package/integration/hubspot-test/README.md +1 -1
  32. package/jest.isolated-projects.js +31 -1
  33. package/jest.projects.js +87 -1
  34. package/lib/api/dev-server-https.js +1 -1
  35. package/lib/api/dev.api.js +1 -0
  36. package/lib/api/enterprise-knowledge.api.js +63 -0
  37. package/lib/api/evidence.api.js +172 -0
  38. package/lib/api/external-systems.api.js +8 -2
  39. package/lib/api/host-ops.api.js +69 -0
  40. package/lib/api/resource-types.api.js +1 -0
  41. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  42. package/lib/api/types/evidence.types.js +67 -0
  43. package/lib/api/types/resource-types.types.js +2 -0
  44. package/lib/app/controller-application-filter.js +36 -0
  45. package/lib/app/deploy.js +1 -1
  46. package/lib/app/list-external-systems.js +130 -0
  47. package/lib/app/list.js +20 -8
  48. package/lib/app/run.js +3 -1
  49. package/lib/app/show-display.js +8 -3
  50. package/lib/app/show-online.js +178 -0
  51. package/lib/app/show.js +37 -88
  52. package/lib/build/builder-api-docker-staging.js +47 -0
  53. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  54. package/lib/build/standard-docker-build.js +2 -0
  55. package/lib/certification/post-unified-cert-sync.js +4 -31
  56. package/lib/certification/sync-after-external-command.js +0 -1
  57. package/lib/certification/sync-system-certification.js +0 -3
  58. package/lib/channels/add-channel.js +40 -34
  59. package/lib/channels/approval-guides/chatgpt.js +33 -0
  60. package/lib/channels/approval-guides/credential-portal.js +38 -0
  61. package/lib/channels/approval-guides/index.js +110 -0
  62. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  63. package/lib/channels/approval-guides/slack.js +34 -0
  64. package/lib/channels/approval-guides/teams-bot.js +35 -0
  65. package/lib/channels/approval-guides/web-embed.js +32 -0
  66. package/lib/channels/channel-approval-guide.js +11 -0
  67. package/lib/channels/channel-artifact-generator.js +16 -4
  68. package/lib/channels/channel-audit.js +3 -0
  69. package/lib/channels/channel-auth-context.js +1 -1
  70. package/lib/channels/channel-description.js +59 -0
  71. package/lib/channels/channel-integration-generator.js +13 -230
  72. package/lib/channels/channel-integration-template.js +94 -0
  73. package/lib/channels/channel-runtime-resolver.js +43 -3
  74. package/lib/channels/channel-status-display.js +66 -26
  75. package/lib/channels/channel-targets.js +3 -3
  76. package/lib/cli/index.js +27 -3
  77. package/lib/cli/infra-guided.js +5 -1
  78. package/lib/cli/setup-app-external-create.js +111 -0
  79. package/lib/cli/setup-app.help.js +1 -1
  80. package/lib/cli/setup-app.js +38 -125
  81. package/lib/cli/setup-app.test-commands.js +26 -52
  82. package/lib/cli/setup-certification-commands.js +4 -4
  83. package/lib/cli/setup-certification.help.js +9 -9
  84. package/lib/cli/setup-dev-path-commands.js +24 -0
  85. package/lib/cli/setup-dev.js +115 -16
  86. package/lib/cli/setup-external-system-help.js +4 -6
  87. package/lib/cli/setup-external-system.js +58 -52
  88. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  89. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  90. package/lib/cli/setup-infra.js +15 -0
  91. package/lib/cli/setup-list.js +43 -0
  92. package/lib/cli/setup-utility-repair.js +26 -7
  93. package/lib/cli/setup-utility.js +5 -3
  94. package/lib/commands/app.js +15 -43
  95. package/lib/commands/channel-add-setup.js +110 -0
  96. package/lib/commands/channel.js +42 -8
  97. package/lib/commands/datasource-sync-display.js +96 -0
  98. package/lib/commands/datasource-sync-policy.js +210 -0
  99. package/lib/commands/datasource-test-trust-cli.js +6 -6
  100. package/lib/commands/datasource-unified-test-cli.js +2 -1
  101. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  102. package/lib/commands/deploy-gate-failure-details.js +163 -0
  103. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  104. package/lib/commands/dev-cli-handlers.js +64 -61
  105. package/lib/commands/dev-host-ops-params.js +91 -0
  106. package/lib/commands/dev-host-ops-poll.js +111 -0
  107. package/lib/commands/dev-host-ops.js +252 -0
  108. package/lib/commands/dev-init.js +3 -1
  109. package/lib/commands/enterprise-knowledge.js +284 -0
  110. package/lib/commands/evidence-cli-leaves.js +250 -0
  111. package/lib/commands/evidence.js +51 -0
  112. package/lib/commands/governance-cli-shared.js +2 -2
  113. package/lib/commands/governance-command-action.js +2 -2
  114. package/lib/commands/governance-fixture-subjects.js +85 -0
  115. package/lib/commands/governance.js +1 -1
  116. package/lib/commands/lifecycle-command-action.js +2 -2
  117. package/lib/commands/lifecycle-external.js +3 -3
  118. package/lib/commands/manifest-cli-auth.js +29 -0
  119. package/lib/commands/manifest-cli-commands.js +170 -0
  120. package/lib/commands/manifest-cli-integration-path.js +63 -0
  121. package/lib/commands/manifest.js +21 -0
  122. package/lib/commands/protection-cli-leaves.js +3 -3
  123. package/lib/commands/repair-auth-apply.js +15 -1
  124. package/lib/commands/repair-authentications-454.js +169 -0
  125. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  126. package/lib/commands/repair-datasource-apply.js +135 -0
  127. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  128. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  129. package/lib/commands/repair-datasource-operation-security.js +180 -0
  130. package/lib/commands/repair-datasource-run.js +7 -2
  131. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  132. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  133. package/lib/commands/repair-datasource.js +12 -68
  134. package/lib/commands/repair-env-template.js +11 -1
  135. package/lib/commands/repair-external-run.js +121 -31
  136. package/lib/commands/repair-internal.js +1 -1
  137. package/lib/commands/repair-openapi-export.js +156 -0
  138. package/lib/commands/repair-openapi-sync.js +19 -2
  139. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  140. package/lib/commands/repair-persist.js +22 -1
  141. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  142. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  143. package/lib/commands/repair-rbac.js +163 -86
  144. package/lib/commands/repair-steps.js +83 -18
  145. package/lib/commands/repair-system-permissions.js +1 -0
  146. package/lib/commands/repair.js +1 -1
  147. package/lib/commands/resource-type.js +65 -26
  148. package/lib/commands/run-post-publish-data-sync.js +68 -0
  149. package/lib/commands/setup-modes.js +1 -1
  150. package/lib/commands/test-e2e-external.js +21 -8
  151. package/lib/commands/test-governance-cli-options.js +2 -2
  152. package/lib/commands/test-trust-cli-options.js +2 -2
  153. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  154. package/lib/commands/up-builder-api-provision.js +241 -0
  155. package/lib/commands/up-builder-api.js +88 -0
  156. package/lib/commands/up-common.js +25 -1
  157. package/lib/commands/upload-credential-push-log.js +117 -0
  158. package/lib/commands/upload-data-sync-finalize.js +60 -0
  159. package/lib/commands/upload-probe.js +66 -0
  160. package/lib/commands/upload-publish-context.js +4 -1
  161. package/lib/commands/upload-sidecar-followups.js +55 -27
  162. package/lib/commands/upload.js +116 -157
  163. package/lib/commands/verify-governance-combined-external.js +1 -1
  164. package/lib/commands/verify-governance-db.js +2 -2
  165. package/lib/commands/verify-operations-command-action.js +2 -2
  166. package/lib/commands/verify-operations-step-plan.js +2 -2
  167. package/lib/commands/verify-operations-steps.js +2 -2
  168. package/lib/commands/verify-trust-command-action.js +1 -1
  169. package/lib/commands/wizard-core.js +1 -1
  170. package/lib/commands/wizard-headless.js +2 -1
  171. package/lib/core/admin-secrets.js +2 -6
  172. package/lib/core/secrets-env-content.js +10 -4
  173. package/lib/core/secrets-env-write.js +2 -13
  174. package/lib/datasource/agent-trust-run.js +3 -3
  175. package/lib/datasource/deploy.js +3 -1
  176. package/lib/datasource/test-e2e.js +6 -1
  177. package/lib/datasource/unified-validation-run-body.js +4 -1
  178. package/lib/datasource/unified-validation-run.js +1 -1
  179. package/lib/deployment/deploy-poll-ui.js +73 -12
  180. package/lib/deployment/deployer-poll-run.js +113 -0
  181. package/lib/deployment/deployer.js +17 -87
  182. package/lib/evidence/dataplane-context.js +21 -0
  183. package/lib/evidence/evidence-display.js +78 -0
  184. package/lib/evidence/evidence-service.js +392 -0
  185. package/lib/external-system/deploy.js +290 -112
  186. package/lib/external-system/download.js +7 -3
  187. package/lib/external-system/test-execution.js +1 -1
  188. package/lib/external-system/test-system-level.js +8 -10
  189. package/lib/external-system/test.js +12 -6
  190. package/lib/generator/deploy-script.js +73 -0
  191. package/lib/generator/external.js +2 -1
  192. package/lib/generator/index.js +17 -2
  193. package/lib/generator/wizard.js +3 -36
  194. package/lib/internal/fs-real-sync.js +22 -1
  195. package/lib/internal/node-fs.js +2 -0
  196. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  197. package/lib/lifecycle/verify-step-progress.js +1 -1
  198. package/lib/programmatic/access-log.js +26 -0
  199. package/lib/programmatic/auth-config.js +44 -0
  200. package/lib/programmatic/bearer-auth.js +176 -0
  201. package/lib/programmatic/builder-api-request.js +175 -0
  202. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  203. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  204. package/lib/programmatic/builder-api-server.js +230 -0
  205. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  206. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  207. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  208. package/lib/programmatic/builder-help-envelope.js +36 -0
  209. package/lib/programmatic/builder-help-fixtures.js +200 -0
  210. package/lib/programmatic/builder-help-governance.js +172 -0
  211. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  212. package/lib/programmatic/builder-help.js +361 -0
  213. package/lib/programmatic/capability-registry.js +77 -0
  214. package/lib/programmatic/command-options.js +32 -0
  215. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  216. package/lib/programmatic/http-problem-details.js +99 -0
  217. package/lib/programmatic/http-route-match.js +40 -0
  218. package/lib/programmatic/idempotency-cache.js +69 -0
  219. package/lib/programmatic/index.js +53 -0
  220. package/lib/programmatic/integration-path-scope.js +39 -0
  221. package/lib/programmatic/log-redaction.js +66 -0
  222. package/lib/programmatic/manifest-get-section.js +146 -0
  223. package/lib/programmatic/manifest-patch-section.js +252 -0
  224. package/lib/programmatic/manifest-repair.js +122 -0
  225. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  226. package/lib/programmatic/manifest-section-io.js +225 -0
  227. package/lib/programmatic/manifest-section-quality.js +171 -0
  228. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  229. package/lib/programmatic/manifest-section-registry.js +205 -0
  230. package/lib/programmatic/nest-http-bridge.js +34 -0
  231. package/lib/programmatic/openapi-component-schemas.js +68 -0
  232. package/lib/programmatic/openapi-description-enricher.js +117 -0
  233. package/lib/programmatic/openapi-descriptions.js +190 -0
  234. package/lib/programmatic/openapi-docs-serving.js +123 -0
  235. package/lib/programmatic/openapi-help-schemas.js +63 -0
  236. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  237. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  238. package/lib/programmatic/openapi-request-schemas.js +155 -0
  239. package/lib/programmatic/openapi-result-schemas.js +476 -0
  240. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  241. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  242. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  243. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  244. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  245. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  246. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  247. package/lib/programmatic/openapi-spec.js +203 -0
  248. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  249. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  250. package/lib/programmatic/request-timeout.js +53 -0
  251. package/lib/programmatic/route-handler-map.js +143 -0
  252. package/lib/programmatic/route-handlers-context.js +29 -0
  253. package/lib/programmatic/route-handlers.js +33 -0
  254. package/lib/programmatic/run-certify.js +57 -0
  255. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  256. package/lib/programmatic/run-lifecycle.js +29 -0
  257. package/lib/programmatic/run-repair.js +41 -0
  258. package/lib/programmatic/run-repository-emcp.js +54 -0
  259. package/lib/programmatic/run-template-workspace.js +61 -0
  260. package/lib/programmatic/run-test.js +49 -0
  261. package/lib/programmatic/run-upload.js +63 -0
  262. package/lib/programmatic/run-validate.js +53 -0
  263. package/lib/programmatic/run-wizard.js +40 -0
  264. package/lib/programmatic/system-key.js +48 -0
  265. package/lib/programmatic/wizard-config-normalize.js +118 -0
  266. package/lib/programmatic/workspace-cleanup.js +128 -0
  267. package/lib/programmatic/workspace-context.js +145 -0
  268. package/lib/programmatic/workspace-lock.js +75 -0
  269. package/lib/programmatic/workspace-meta.js +64 -0
  270. package/lib/programmatic/workspace-ops.js +149 -0
  271. package/lib/protection/run-commands-upload-sync.js +35 -0
  272. package/lib/protection/run-commands.js +2 -20
  273. package/lib/protection/upload-batch.js +11 -7
  274. package/lib/resolvers/resource-type-file.js +22 -0
  275. package/lib/schema/external-datasource.schema.json +161 -1
  276. package/lib/schema/external-system.schema.json +242 -4
  277. package/lib/schema/flag-map-validation-run.json +3 -0
  278. package/lib/schema/type/credential-field-registry.json +2 -2
  279. package/lib/schema/type/document-storage.json +9 -0
  280. package/lib/utils/agent-trust-run-display.js +1 -1
  281. package/lib/utils/app-path-resolve.js +168 -0
  282. package/lib/utils/authentication-env-template.js +222 -0
  283. package/lib/utils/cli-sync-options.js +7 -11
  284. package/lib/utils/cli-utils.js +4 -0
  285. package/lib/utils/cli-workspace-options.js +29 -0
  286. package/lib/utils/compose-generate-docker-compose.js +102 -0
  287. package/lib/utils/configuration-env-resolver.js +203 -27
  288. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  289. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  290. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  291. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  292. package/lib/utils/datasource-test-run-display.js +2 -1
  293. package/lib/utils/dev-init-ssh-merge.js +165 -23
  294. package/lib/utils/dev-pin-share-instructions.js +110 -0
  295. package/lib/utils/dev-ssh-config-helper.js +177 -33
  296. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  297. package/lib/utils/env-copy.js +2 -1
  298. package/lib/utils/env-dotenv-format.js +103 -0
  299. package/lib/utils/external-env-template.js +4 -1
  300. package/lib/utils/external-system-display.js +5 -1
  301. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  302. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  303. package/lib/utils/external-system-readiness-core.js +16 -0
  304. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  305. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  306. package/lib/utils/external-system-readiness-display.js +20 -30
  307. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  308. package/lib/utils/external-system-system-test-tty.js +5 -41
  309. package/lib/utils/help-builder.js +6 -1
  310. package/lib/utils/host-ops-job-labels.js +236 -0
  311. package/lib/utils/host-ops-job-result.js +61 -0
  312. package/lib/utils/host-ops-poll-ui.js +163 -0
  313. package/lib/utils/integration-path-resolve.js +112 -0
  314. package/lib/utils/paths-reload-source.js +148 -0
  315. package/lib/utils/paths-system-builder-keys.js +25 -0
  316. package/lib/utils/paths.js +151 -26
  317. package/lib/utils/runtime-configuration-values.js +64 -2
  318. package/lib/utils/secrets-helpers.js +5 -1
  319. package/lib/utils/ssh-known-hosts.js +130 -0
  320. package/lib/utils/test-target-cli-options.js +75 -0
  321. package/lib/utils/upload-sync-options.js +4 -0
  322. package/lib/utils/validation-run-request.js +11 -2
  323. package/lib/validation/external-manifest-validator.js +11 -1
  324. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  325. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  326. package/lib/validation/validate-external-file.js +160 -0
  327. package/lib/validation/validate.js +6 -117
  328. package/package.json +46 -29
  329. package/packages/builder-api/README.md +120 -0
  330. package/packages/builder-api/package.json +30 -0
  331. package/packages/builder-api/src/app.module.ts +7 -0
  332. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  333. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  334. package/packages/builder-api/src/main.ts +16 -0
  335. package/packages/builder-api/tsconfig.json +15 -0
  336. package/scripts/check-builder-api-architecture-grep.js +79 -0
  337. package/scripts/docker_image_content_gate.js +47 -0
  338. package/scripts/docker_image_content_gate.sh +5 -0
  339. package/scripts/export-builder-api-evidence.js +262 -0
  340. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  341. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  342. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  343. package/scripts/lib/plan-actor.js +109 -0
  344. package/scripts/lib/plan-config.js +20 -0
  345. package/scripts/lib/plan-gates.js +154 -0
  346. package/scripts/lib/plan-meta.js +104 -0
  347. package/scripts/lib/plan-parse.js +162 -0
  348. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  349. package/scripts/lib/plan-run-core.js +125 -0
  350. package/scripts/lib/plan-run-report.js +108 -0
  351. package/scripts/plan-approve.js +24 -0
  352. package/scripts/plan-archive.js +49 -0
  353. package/scripts/plan-run.js +13 -0
  354. package/scripts/plan-set-actor.js +21 -0
  355. package/scripts/plan-validate.js +80 -0
  356. package/scripts/pnpm/af.mjs +110 -0
  357. package/scripts/pnpm/check-quiet.mjs +32 -0
  358. package/scripts/pnpm/dev-install.mjs +29 -0
  359. package/scripts/pnpm/dev-reload.mjs +18 -0
  360. package/scripts/pnpm/help.mjs +55 -0
  361. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  362. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  363. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  364. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  365. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  366. package/scripts/pnpm/lib/spinner.mjs +42 -0
  367. package/scripts/stage_builder_api_for_docker.js +65 -0
  368. package/scripts/sync-builder-api-template.js +44 -0
  369. package/templates/README.md +3 -0
  370. package/templates/applications/builder-api/Dockerfile +38 -0
  371. package/templates/applications/builder-api/application.yaml +75 -0
  372. package/templates/applications/builder-api/env.template +48 -0
  373. package/templates/applications/dataplane/application.yaml +1 -1
  374. package/templates/applications/dataplane/env.template +10 -6
  375. package/templates/applications/dataplane/rbac.yaml +21 -1
  376. package/templates/applications/miso-controller/application.yaml +1 -1
  377. package/templates/applications/miso-controller/env.template +1 -3
  378. package/templates/channels/README.md +18 -0
  379. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  380. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  381. package/templates/channels/chatgpt/integration/README.md +11 -0
  382. package/templates/channels/chatgpt/integration/application.json +15 -0
  383. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  384. package/templates/channels/chatgpt/integration/env.template +4 -0
  385. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  386. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  387. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  388. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  389. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  390. package/templates/channels/slack/install.template.md.hbs +48 -18
  391. package/templates/channels/slack/integration/README.md +38 -0
  392. package/templates/channels/slack/integration/application.json +18 -0
  393. package/templates/channels/slack/integration/env.template +29 -0
  394. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  395. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  396. package/templates/channels/slack/integration/slack-system.json +86 -0
  397. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  398. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  399. package/templates/channels/teams-bot/integration/README.md +18 -0
  400. package/templates/channels/teams-bot/integration/application.json +17 -0
  401. package/templates/channels/teams-bot/integration/env.template +5 -0
  402. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  403. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  404. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  405. package/templates/channels/web-embed/integration/README.md +11 -0
  406. package/templates/channels/web-embed/integration/application.json +15 -0
  407. package/templates/channels/web-embed/integration/env.template +4 -0
  408. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  409. package/templates/openapi/redoc_page.html +86 -0
  410. package/templates/python/docker-compose.hbs +11 -0
  411. package/templates/python/requirements.txt +1 -1
  412. package/templates/typescript/docker-compose.hbs +11 -0
  413. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Channel integration templates — copied from templates/channels/<target>/integration/.
3
+ * SSOT for slack: aifabrix-dataplane/integration/slack (make sync-json in dataplane).
4
+ *
5
+ * @fileoverview Template resolution and copy for channel scaffold (plan 152)
6
+ * @author AI Fabrix Team
7
+ * @version 2.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ const { nodeFs } = require('../internal/node-fs');
13
+ const fs = nodeFs();
14
+ const path = require('path');
15
+ const { getChannelTarget } = require('./channel-targets');
16
+
17
+ const BUILDER_ROOT = path.join(__dirname, '..', '..');
18
+
19
+ /** @type {RegExp[]} */
20
+ const SKIP_TEMPLATE_FILE = [
21
+ /^\./,
22
+ /-deploy\.json$/,
23
+ /^INTEGRATION_CHANGELOG\.md$/i
24
+ ];
25
+
26
+ /**
27
+ * @param {string} channelTarget
28
+ * @returns {string}
29
+ */
30
+ function getChannelIntegrationTemplateDir(channelTarget) {
31
+ const target = getChannelTarget(channelTarget);
32
+ return path.join(BUILDER_ROOT, 'templates', 'channels', target.templateDir, 'integration');
33
+ }
34
+
35
+ /**
36
+ * @param {string} name
37
+ * @returns {boolean}
38
+ */
39
+ function shouldCopyTemplateFile(name) {
40
+ return !SKIP_TEMPLATE_FILE.some((pattern) => pattern.test(name));
41
+ }
42
+
43
+ /**
44
+ * @param {string} templateDir
45
+ * @returns {string[]}
46
+ */
47
+ function listChannelIntegrationTemplateFiles(templateDir) {
48
+ if (!fs.existsSync(templateDir)) {
49
+ return [];
50
+ }
51
+ return fs
52
+ .readdirSync(templateDir)
53
+ .filter((name) => {
54
+ const full = path.join(templateDir, name);
55
+ return fs.statSync(full).isFile() && shouldCopyTemplateFile(name);
56
+ })
57
+ .sort();
58
+ }
59
+
60
+ /**
61
+ * @param {string} channelTarget
62
+ * @param {string} integrationDir
63
+ * @returns {string[]} Copied file paths
64
+ */
65
+ function copyChannelIntegrationTemplate(channelTarget, integrationDir) {
66
+ const templateDir = getChannelIntegrationTemplateDir(channelTarget);
67
+ const names = listChannelIntegrationTemplateFiles(templateDir);
68
+ if (names.length === 0) {
69
+ throw new Error(
70
+ `Channel integration template missing for "${channelTarget}" (${templateDir}). ` +
71
+ 'For slack: edit aifabrix-dataplane/integration/slack and run make sync-json. ' +
72
+ 'For other targets: add templates/channels/<target>/integration/ until dataplane SSOT exists.'
73
+ );
74
+ }
75
+
76
+ fs.mkdirSync(integrationDir, { recursive: true });
77
+ const copied = [];
78
+ for (const name of names) {
79
+ const src = path.join(templateDir, name);
80
+ const dest = path.join(integrationDir, name);
81
+ fs.copyFileSync(src, dest);
82
+ copied.push(dest);
83
+ }
84
+ return copied;
85
+ }
86
+
87
+ module.exports = {
88
+ BUILDER_ROOT,
89
+ SKIP_TEMPLATE_FILE,
90
+ getChannelIntegrationTemplateDir,
91
+ shouldCopyTemplateFile,
92
+ listChannelIntegrationTemplateFiles,
93
+ copyChannelIntegrationTemplate
94
+ };
@@ -9,6 +9,10 @@
9
9
  'use strict';
10
10
 
11
11
  const { getChannelTarget } = require('./channel-targets');
12
+ const { normalizeSlackAppDescription } = require('./channel-description');
13
+
14
+ /** Default Slack slash prefix — matches dataplane `templates/slack/command_catalog.yaml`. */
15
+ const DEFAULT_SLACK_COMMAND_PREFIX = 'af';
12
16
 
13
17
  /**
14
18
  * Normalize dataplane base URL (no trailing slash).
@@ -50,7 +54,6 @@ function getEndpointPathSuffixes(channelTarget) {
50
54
  slack: {
51
55
  eventsUrl: '/events',
52
56
  interactionUrl: '/interactive',
53
- oauthCallbackUrl: '/oauth/callback',
54
57
  commandUrl: '/commands'
55
58
  },
56
59
  'teams-bot': {
@@ -97,6 +100,26 @@ function getLegacyApiPaths(channelTarget) {
97
100
  return legacy[channelTarget] || {};
98
101
  }
99
102
 
103
+ /**
104
+ * Slack token rotation requires OAuth redirect URLs (api.slack.com app manifest).
105
+ * @param {string|undefined} oauthCallbackUrl
106
+ * @returns {{ oauthCallbackUrl?: string, slackRedirectUrlsJson: string, slackTokenRotationEnabled: boolean }}
107
+ */
108
+ function resolveSlackOAuthManifestFields(oauthCallbackUrl) {
109
+ const url = typeof oauthCallbackUrl === 'string' ? oauthCallbackUrl.trim() : '';
110
+ if (!url) {
111
+ return {
112
+ slackRedirectUrlsJson: '[]',
113
+ slackTokenRotationEnabled: false
114
+ };
115
+ }
116
+ return {
117
+ oauthCallbackUrl: url,
118
+ slackRedirectUrlsJson: JSON.stringify([url]),
119
+ slackTokenRotationEnabled: true
120
+ };
121
+ }
122
+
100
123
  /**
101
124
  * @param {Object} params
102
125
  * @param {string} params.dataplaneBaseUrl
@@ -106,6 +129,7 @@ function getLegacyApiPaths(channelTarget) {
106
129
  * @param {string} [params.environment]
107
130
  * @param {string} params.appDescription
108
131
  * @param {string} [params.icon]
132
+ * @param {string} [params.commandPrefix] Slack slash alias prefix (default `af`)
109
133
  * @returns {Object}
110
134
  */
111
135
  function resolveChannelRuntimeValues(params) {
@@ -123,9 +147,13 @@ function resolveChannelRuntimeValues(params) {
123
147
  appName: params.appName,
124
148
  baseName: params.baseName || params.appName,
125
149
  environment: params.environment || 'dev',
126
- appDescription: params.appDescription,
150
+ appDescription:
151
+ params.channelTarget === 'slack'
152
+ ? normalizeSlackAppDescription(params.appDescription)
153
+ : params.appDescription,
127
154
  icon: params.icon || '',
128
155
  credentialKey: target.credentialKey,
156
+ credentialPortalUrl: joinUrl(base, `/connected-systems/${params.channelTarget}?tab=authentication`),
129
157
  assistantCatalogUrl: joinUrl(base, '/api/v1/workers/available'),
130
158
  scopes: []
131
159
  };
@@ -140,6 +168,16 @@ function resolveChannelRuntimeValues(params) {
140
168
  }
141
169
  }
142
170
 
171
+ if (params.channelTarget === 'slack') {
172
+ const oauthCallbackUrl = params.oauthCallbackUrl || resolved.oauthCallbackUrl;
173
+ Object.assign(resolved, resolveSlackOAuthManifestFields(oauthCallbackUrl));
174
+ const prefix =
175
+ typeof params.commandPrefix === 'string' && params.commandPrefix.trim()
176
+ ? params.commandPrefix.trim()
177
+ : DEFAULT_SLACK_COMMAND_PREFIX;
178
+ resolved.commandPrefix = prefix;
179
+ }
180
+
143
181
  return resolved;
144
182
  }
145
183
 
@@ -148,5 +186,7 @@ module.exports = {
148
186
  joinUrl,
149
187
  externalSystemsPrefix,
150
188
  getEndpointPathSuffixes,
151
- resolveChannelRuntimeValues
189
+ resolveSlackOAuthManifestFields,
190
+ resolveChannelRuntimeValues,
191
+ DEFAULT_SLACK_COMMAND_PREFIX
152
192
  };
@@ -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 = `