@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
@@ -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
  };
@@ -7,7 +7,6 @@
7
7
  const chalk = require('chalk');
8
8
  const logger = require('../utils/logger');
9
9
  const { handleCommandError } = require('../utils/cli-utils');
10
- const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
11
10
  const {
12
11
  TEST_HELP_AFTER,
13
12
  TEST_E2E_HELP_AFTER
@@ -18,7 +17,7 @@ function setupTestCommand(program) {
18
17
  .description('Tests: builder appKey in container; external systemKey = local validation')
19
18
  .option('-e, --env <env>', 'For builder app: dev (running container) or tst (ephemeral)', 'dev')
20
19
  .option('-v, --verbose', 'Verbose output')
21
- .option('-d, --debug', 'Write debug log to integration/<systemKey>/logs/ (external only)')
20
+ .option('-d, --debug', 'Certification debug + log to integration/<systemKey>/logs/ (external only)')
22
21
  .option(
23
22
  '--sync',
24
23
  'Not supported for this command (local validation only). Use aifabrix upload <systemKey> or dataplane test commands with --sync.'
@@ -58,45 +57,22 @@ function setupTestCommand(program) {
58
57
  }
59
58
 
60
59
  /**
61
- * First failed `certificateIssuance` across E2E datasource rows (for cert-sync hint).
62
- * @param {Array<{ key?: string, datasourceTestRun?: { certificateIssuance?: { status?: string, reasonCode?: string, message?: string } } }>} results
63
- * @returns {string|null}
64
- */
65
- function firstIssuanceFailureHintFromE2eResults(results) {
66
- const failed = [];
67
- for (const row of results || []) {
68
- const ci = row.datasourceTestRun && row.datasourceTestRun.certificateIssuance;
69
- if (ci && ci.status === 'failed') {
70
- failed.push({ key: row.key, ci });
71
- }
72
- }
73
- if (failed.length === 0) return null;
74
- const firstRc = failed[0].ci.reasonCode;
75
- const sameAll = failed.every(f => f.ci.reasonCode === firstRc);
76
- if (sameAll && failed.length > 1) {
77
- const parts = [firstRc, failed[0].ci.message].filter(Boolean);
78
- return `${parts.join(': ')} (${failed.length} datasource scopes; first: ${failed[0].key})`;
79
- }
80
- const parts = [failed[0].ci.reasonCode, failed[0].ci.message].filter(Boolean);
81
- return `[${failed[0].key}] ${parts.join(': ')}`.trim();
82
- }
83
-
84
- /**
85
- * External integration E2E: run, display, exit on aggregate, optional cert sync.
60
+ * External integration E2E: run, display, exit on aggregate.
86
61
  * @param {string} appName
87
62
  * @param {Object} options
88
63
  * @returns {Promise<void>}
89
64
  */
90
- async function runExternalIntegrationE2EAndCertSync(appName, options, cmd) {
91
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
65
+ async function runExternalIntegrationE2EAndExit(appName, options, cmd) {
66
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
92
67
  const { runTestE2EForExternalSystem } = require('../commands/test-e2e-external');
93
- const noSync = cliOptsSkipSync(options, cmd);
68
+ const noPublish = cliOptsSkipPublish(options, cmd);
94
69
  const { success, results } = await runTestE2EForExternalSystem(appName, {
95
70
  env: options.env,
96
71
  debug: options.debug,
97
72
  verbose: options.verbose,
98
73
  async: options.async !== false,
99
- noSync
74
+ noPublish,
75
+ syncMode: options.syncMode
100
76
  });
101
77
  const { displayIntegrationTestResults } = require('../utils/external-system-display');
102
78
  const datasourceResults = results.map(r => ({
@@ -117,25 +93,21 @@ async function runExternalIntegrationE2EAndCertSync(appName, options, cmd) {
117
93
  requireCert: options.requireCert === true
118
94
  });
119
95
  if (exitCode !== 0) process.exit(exitCode);
120
- if (cliOptsSkipCertSync(options)) return;
121
- const { trySyncCertificationFromDataplaneForExternalApp } = require('../certification/sync-after-external-command');
122
- const issuanceFailureHint = firstIssuanceFailureHintFromE2eResults(results);
123
- await trySyncCertificationFromDataplaneForExternalApp(appName, 'test-e2e', { issuanceFailureHint });
124
96
  }
125
97
 
126
98
  async function runTestE2ECommand(appName, options, cmd) {
127
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
128
- const noSync = cliOptsSkipSync(options, cmd);
99
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
100
+ const noPublish = cliOptsSkipPublish(options, cmd);
129
101
  const pathsUtil = require('../utils/paths');
130
102
  const appType = await pathsUtil.detectAppType(appName).catch(() => null);
131
- if (noSync && appType && appType.baseDir === 'builder') {
103
+ if (noPublish && appType && appType.baseDir === 'builder') {
132
104
  throw new Error(
133
- 'Option --no-sync applies only to external integration E2E (integration/<systemKey>/). ' +
134
- 'Remove --no-sync for builder app E2E.'
105
+ 'Option --no-publish applies only to external integration E2E (integration/<systemKey>/). ' +
106
+ 'Remove --no-publish for builder app E2E.'
135
107
  );
136
108
  }
137
109
  if (appType && appType.baseDir === 'integration') {
138
- await runExternalIntegrationE2EAndCertSync(appName, options, cmd);
110
+ await runExternalIntegrationE2EAndExit(appName, options, cmd);
139
111
  return;
140
112
  }
141
113
  const { runAppTestE2e } = require('../commands/app-test');
@@ -170,21 +142,24 @@ function setupTestE2eCommand(program) {
170
142
  .description('E2E: builder appKey in container; external systemKey = all datasources via dataplane')
171
143
  .option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
172
144
  .option('-v, --verbose', 'Show detailed step output and poll progress')
173
- .option('-d, --debug', 'Include debug output and write log to integration/<systemKey>/logs/')
174
- .option(
175
- '--no-sync',
176
- 'Skip publishing local integration files; E2E uses the system config already on the dataplane (external integration only)'
177
- )
145
+ .option('-d, --debug', 'Certification debug + log to integration/<systemKey>/logs/')
146
+ .option('--no-publish', 'Skip publishing local integration files before E2E')
178
147
  .option(
179
148
  '--force',
180
149
  'With default sync, pass force to upload (bypass active-datasource schema replacement guards; same as aifabrix upload --force)'
181
150
  )
182
- .option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
183
- .option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
184
151
  .option(
185
- '--no-cert-sync',
186
- 'Skip updating the system file certification block from the dataplane after a successful run'
152
+ '--version <target>',
153
+ 'Manifest version for E2E (latest, running, or explicit version id)',
154
+ 'latest'
187
155
  )
156
+ .option(
157
+ '--sync-mode <mode>',
158
+ 'Sync policy during E2E: auto (default), never, or force. Distinct from default pre-run publish.',
159
+ 'auto'
160
+ )
161
+ .option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
162
+ .option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
188
163
  .addHelpText('after', TEST_E2E_HELP_AFTER)
189
164
  .action(async(appName, options, cmd) => {
190
165
  try {
@@ -232,7 +207,6 @@ function setupInstallTestE2eLintCommands(program) {
232
207
  }
233
208
 
234
209
  module.exports = {
235
- setupInstallTestE2eLintCommands,
236
- firstIssuanceFailureHintFromE2eResults
210
+ setupInstallTestE2eLintCommands
237
211
  };
238
212
 
@@ -20,7 +20,7 @@ function setupVerifyOperationsCommand(program) {
20
20
  .option('-e, --env <env>', 'Environment: dev, tst, or pro', 'dev')
21
21
  .option('-v, --verbose', 'Readiness breakdown and verification step checklist')
22
22
  .option('-d, --debug', 'Write debug logs under integration/<systemKey>/logs/')
23
- .option('--no-sync', 'Skip publishing local integration files before dataplane steps')
23
+ .option('--no-publish', 'Skip publishing local integration files before dataplane steps')
24
24
  .option(
25
25
  '--force',
26
26
  'With default sync, pass force to upload (same as aifabrix upload --force)'
@@ -39,7 +39,7 @@ function setupVerifyTrustCommand(program) {
39
39
  .option('-e, --env <env>', 'Environment: dev, tst, or pro', 'dev')
40
40
  .option('-v, --verbose', 'Per-datasource breakdown')
41
41
  .option('-d, --debug', 'Write debug log under integration/<systemKey>/logs/')
42
- .option('--no-sync', 'Skip publishing local integration files before validate')
42
+ .option('--no-publish', 'Skip publishing local integration files before validate')
43
43
  .option(
44
44
  '--force',
45
45
  'With default sync, pass force to upload (same as aifabrix upload --force)'
@@ -61,7 +61,7 @@ function setupVerifyGovernanceCommand(program) {
61
61
  .option('-e, --env <env>', 'Environment: dev, tst, or pro', 'dev')
62
62
  .option('-v, --verbose', 'Per-datasource breakdown and pipeline detail')
63
63
  .option('-d, --debug', 'Write debug logs under integration/<systemKey>/logs/')
64
- .option('--no-sync', 'Skip publishing local integration files before dataplane steps')
64
+ .option('--no-publish', 'Skip publishing local integration files before dataplane steps')
65
65
  .option(
66
66
  '--force',
67
67
  'With default sync, pass force to upload (same as aifabrix upload --force)'
@@ -108,7 +108,7 @@ function setupLifecycleCommand(program) {
108
108
  .option('-v, --verbose', 'Per-datasource breakdown in the report')
109
109
  .option('-d, --debug', 'Write debug logs under integration/<systemKey>/logs/ when --run')
110
110
  .option('--run', 'Run missing verify steps, then print certification report')
111
- .option('--no-sync', 'With --run, skip publishing local integration files before verify')
111
+ .option('--no-publish', 'With --run, skip publishing local integration files before verify')
112
112
  .option(
113
113
  '--force',
114
114
  'With default sync on --run, pass force to upload (same as aifabrix upload --force)'
@@ -8,7 +8,7 @@ const VERIFY_OPERATIONS_HELP_AFTER = `
8
8
  Examples:
9
9
  $ aifabrix verify-operations hubspot
10
10
  $ aifabrix verify-operations hubspot -v
11
- $ aifabrix verify-operations hubspot --no-sync
11
+ $ aifabrix verify-operations hubspot --no-publish
12
12
 
13
13
  Notes:
14
14
  - Orchestrates validate → test → test-integration → test-e2e for the system.
@@ -23,12 +23,12 @@ const VERIFY_TRUST_HELP_AFTER = `
23
23
  Examples:
24
24
  $ aifabrix verify-trust hubspot
25
25
  $ aifabrix verify-trust hubspot -v --revalidate
26
- $ aifabrix verify-trust hubspot --no-sync --json
26
+ $ aifabrix verify-trust hubspot --no-publish --json
27
27
 
28
28
  Notes:
29
29
  - For one datasource: aifabrix datasource verify-trust <datasourceKey>
30
30
  - Does not call external vendor APIs (use verify-operations / test-e2e for connectivity).
31
- - Local integration files are published before run unless --no-sync.
31
+ - Local integration files are published before run unless --no-publish.
32
32
  `;
33
33
 
34
34
  const VERIFY_GOVERNANCE_HELP_AFTER = `
@@ -38,7 +38,7 @@ Examples:
38
38
  $ aifabrix verify-governance hubspot-e2e --certification-profile gold --json
39
39
 
40
40
  Notes:
41
- - All-in-one: publishes local integration (unless --no-sync), generates packs on the dataplane,
41
+ - All-in-one: publishes local integration (unless --no-publish), generates packs on the dataplane,
42
42
  then runs governance verification (dataplane-first; no local YAML upload).
43
43
  - Requires at least one --subject-user-id or --subject-email (repeatable or comma-separated).
44
44
  - Prefer this over separate generate + verify when certifying an integration.
@@ -50,12 +50,12 @@ const GOVERNANCE_GENERATE_HELP_AFTER = `
50
50
  Examples:
51
51
  $ aifabrix governance generate hubspot-e2e --subject-email us.sales@example.com
52
52
  $ aifabrix governance generate hubspot-e2e --subject-user-id user-a --subject-user-id user-b -v
53
- $ aifabrix governance generate hubspot-e2e --certification-profile gold --no-sync
53
+ $ aifabrix governance generate hubspot-e2e --certification-profile gold --no-publish
54
54
 
55
55
  Notes:
56
56
  - Dataplane generates keys, coverage, and generationState; the CLI never authors partitions locally.
57
57
  - Requires at least one --subject-user-id or --subject-email per datasource fan-out.
58
- - Publishes local integration files before generate unless --no-sync.
58
+ - Publishes local integration files before generate unless --no-publish.
59
59
  `;
60
60
 
61
61
  const GOVERNANCE_VERIFY_HELP_AFTER = `
@@ -74,7 +74,7 @@ Notes:
74
74
  const GOVERNANCE_UPLOAD_HELP_AFTER = `
75
75
  Examples:
76
76
  $ aifabrix governance upload hubspot-e2e
77
- $ aifabrix governance upload hubspot-e2e --no-sync
77
+ $ aifabrix governance upload hubspot-e2e --no-publish
78
78
 
79
79
  Notes:
80
80
  - Expert path: pushes integration/<systemKey>/scenarios/*.yaml to the dataplane.
@@ -98,13 +98,13 @@ Examples:
98
98
  $ aifabrix lifecycle hubspot
99
99
  $ aifabrix lifecycle hubspot -v
100
100
  $ aifabrix lifecycle hubspot --run
101
- $ aifabrix lifecycle hubspot --run --no-sync
101
+ $ aifabrix lifecycle hubspot --run --no-publish
102
102
  $ aifabrix lifecycle hubspot-e2e --run --subject-email us.sales@example.com
103
103
  $ aifabrix lifecycle hubspot-e2e --run --subject-email a@x.com,b@y.com -v
104
104
 
105
105
  Notes:
106
106
  - Default: certification report only (GET persisted pillar results from dataplane).
107
- - --run executes missing verify steps, then prints the report (publishes local files first unless --no-sync).
107
+ - --run executes missing verify steps, then prints the report (publishes local files first unless --no-publish).
108
108
  - With --run, --subject-email / --subject-user-id generate and verify governance packs (same as verify-governance).
109
109
  - Repeat the flag or use comma-separated values: --subject-email a@x.com,b@y.com
110
110
  - One-shot cert path: lifecycle <systemKey> --run --subject-email <email>
@@ -44,6 +44,29 @@ async function runShellEnvRegistration() {
44
44
  }
45
45
  }
46
46
 
47
+ function addSetEnvConfigCommand(dev) {
48
+ dev
49
+ .command('set-env-config <path>')
50
+ .description('Set or clear aifabrix-env-config path in ~/.aifabrix/config.yaml')
51
+ .action(async(envConfigPath) => {
52
+ try {
53
+ const trimmed = (envConfigPath || '').trim();
54
+ await config.setAifabrixEnvConfigPath(trimmed);
55
+ logger.log(
56
+ trimmed === ''
57
+ ? formatSuccessLine('Env config path cleared')
58
+ : formatSuccessLine(`Env config path set to ${trimmed}`)
59
+ );
60
+ const devId = await config.getDeveloperId();
61
+ const { displayDevConfig } = require('../commands/dev-show-display');
62
+ await displayDevConfig(devId);
63
+ } catch (error) {
64
+ handleCommandError(error, 'dev set-env-config');
65
+ process.exit(1);
66
+ }
67
+ });
68
+ }
69
+
47
70
  function addSetHomeCommand(dev) {
48
71
  dev
49
72
  .command('set-home <path>')
@@ -162,6 +185,7 @@ function addSetFormatCommand(dev, handleSetFormat) {
162
185
  * @returns {void}
163
186
  */
164
187
  function setupDevPathAndFormatCommands(dev, handleSetFormat) {
188
+ addSetEnvConfigCommand(dev);
165
189
  addSetHomeCommand(dev);
166
190
  addSetWorkCommand(dev);
167
191
  addPrintHomeWorkCommands(dev);