@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,284 @@
1
+ /**
2
+ * Enterprise Knowledge CLI commands (456.16).
3
+ *
4
+ * @fileoverview enterprise-knowledge generate-manifest
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const {
12
+ existsSync,
13
+ readFileSync,
14
+ mkdirSync,
15
+ writeFileSync
16
+ } = require('../internal/fs-real-sync');
17
+ const path = require('path');
18
+ const chalk = require('chalk');
19
+ const logger = require('../utils/logger');
20
+ const { resolveControllerUrl } = require('../utils/controller-url');
21
+ const { resolveDataplaneAndAuth } = require('./upload');
22
+ const { postGenerateManifest } = require('../api/enterprise-knowledge.api');
23
+ const { getEnterpriseKnowledgePath } = require('../utils/enterprise-knowledge-paths');
24
+ const { resolveAppWorkspace } = require('../utils/app-path-resolve');
25
+ const {
26
+ formatBlockingError,
27
+ formatSuccessLine,
28
+ formatWarningLine,
29
+ infoLine,
30
+ headerKeyValue
31
+ } = require('../utils/cli-layout-chalk');
32
+ const { formatApiError } = require('../utils/api-error-handler');
33
+
34
+ const DOMAIN_PATTERN = /^[a-z][a-z0-9-]*$/;
35
+ const GENERATED_DIR = 'generated-service-contracts';
36
+ const DEFAULT_PREVIEW_FILE = 'generate-manifest-preview.json';
37
+
38
+ const ENTERPRISE_KNOWLEDGE_HELP_AFTER = `
39
+
40
+ Examples:
41
+ $ aifabrix enterprise-knowledge generate-manifest --domain sales
42
+ $ aifabrix enterprise-knowledge generate-manifest --domain sales --source-system hubspot-e2e
43
+ $ aifabrix enterprise-knowledge generate-manifest --domain sales --output ./preview.json
44
+
45
+ Per-command help: aifabrix enterprise-knowledge <command> --help
46
+ `;
47
+
48
+ const GENERATE_MANIFEST_HELP_AFTER = `
49
+
50
+ Examples:
51
+ $ aifabrix enterprise-knowledge generate-manifest --domain sales
52
+ $ aifabrix enterprise-knowledge generate-manifest --domain sales --owner-system-key ek-sales
53
+ $ aifabrix enterprise-knowledge generate-manifest --domain sales --source-system vendor-crm --json
54
+
55
+ Preview only — review output before upload (candidate) and deploy.
56
+
57
+ `;
58
+
59
+ /**
60
+ * @param {string} raw
61
+ * @returns {string}
62
+ */
63
+ function requireDomain(raw) {
64
+ const domain = String(raw || '').trim().toLowerCase();
65
+ if (!domain) {
66
+ throw new Error('--domain is required.');
67
+ }
68
+ if (!DOMAIN_PATTERN.test(domain)) {
69
+ throw new Error(
70
+ 'domain must start with a lowercase letter and contain only lowercase letters, numbers, and hyphens.'
71
+ );
72
+ }
73
+ return domain;
74
+ }
75
+
76
+ /**
77
+ * @param {string} domain
78
+ * @param {string|undefined|null} raw
79
+ * @returns {string}
80
+ */
81
+ function resolveOwnerSystemKey(domain, raw) {
82
+ const key = String(raw || '').trim() || `ek-${domain}`;
83
+ if (!/^[a-z0-9-_]+$/.test(key)) {
84
+ throw new Error('owner-system-key must contain only lowercase letters, numbers, hyphens, and underscores.');
85
+ }
86
+ return key;
87
+ }
88
+
89
+ /**
90
+ * @param {string} ownerSystemKey
91
+ * @returns {Object[]}
92
+ */
93
+ function loadAnchorSubscriptions(ownerSystemKey) {
94
+ try {
95
+ const { appPath } = resolveAppWorkspace(ownerSystemKey, {
96
+ workspace: 'enterprise-knowledge'
97
+ });
98
+ const systemFile = path.join(appPath, `${ownerSystemKey}-system.json`);
99
+ if (!existsSync(systemFile)) {
100
+ return [];
101
+ }
102
+ const raw = JSON.parse(readFileSync(systemFile, 'utf8'));
103
+ return Array.isArray(raw.subscriptions) ? raw.subscriptions : [];
104
+ } catch {
105
+ return [];
106
+ }
107
+ }
108
+
109
+ /**
110
+ * @param {Object} options
111
+ * @param {string} domain
112
+ * @param {string} ownerSystemKey
113
+ * @returns {import('../api/types/enterprise-knowledge.types').GenerateManifestRequest}
114
+ */
115
+ function buildGenerateManifestRequest(options, domain, ownerSystemKey) {
116
+ if (options.file) {
117
+ const filePath = path.resolve(String(options.file));
118
+ if (!existsSync(filePath)) {
119
+ throw new Error(`File not found: ${filePath}`);
120
+ }
121
+ const parsed = JSON.parse(readFileSync(filePath, 'utf8'));
122
+ if (!parsed || typeof parsed !== 'object') {
123
+ throw new Error('Request file must be a JSON object.');
124
+ }
125
+ return {
126
+ domain: requireDomain(parsed.domain || domain),
127
+ ownerSystemKey: resolveOwnerSystemKey(domain, parsed.ownerSystemKey || ownerSystemKey),
128
+ displayName: parsed.displayName,
129
+ description: parsed.description,
130
+ subscriptions: Array.isArray(parsed.subscriptions) ? parsed.subscriptions : [],
131
+ sourceSystemKeys: Array.isArray(parsed.sourceSystemKeys) ? parsed.sourceSystemKeys : [],
132
+ version: parsed.version
133
+ };
134
+ }
135
+
136
+ const sourceKeys = [];
137
+ if (Array.isArray(options.sourceSystem)) {
138
+ sourceKeys.push(...options.sourceSystem.map((k) => String(k).trim()).filter(Boolean));
139
+ } else if (typeof options.sourceSystem === 'string' && options.sourceSystem.trim()) {
140
+ sourceKeys.push(options.sourceSystem.trim());
141
+ }
142
+
143
+ const subscriptions = loadAnchorSubscriptions(ownerSystemKey);
144
+ const title = domain.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
145
+
146
+ return {
147
+ domain,
148
+ ownerSystemKey,
149
+ displayName: options.displayName || `Enterprise Knowledge — ${title}`,
150
+ description:
151
+ options.description ||
152
+ `Domain enterprise-knowledge preview for ${domain}. Human approval required before upload.`,
153
+ subscriptions,
154
+ sourceSystemKeys: sourceKeys,
155
+ version: options.version || '1.0.0'
156
+ };
157
+ }
158
+
159
+ /**
160
+ * @param {string} ownerSystemKey
161
+ * @param {string|undefined|null} outputOption
162
+ * @returns {string}
163
+ */
164
+ function resolveOutputPath(ownerSystemKey, outputOption) {
165
+ if (outputOption) {
166
+ return path.resolve(String(outputOption));
167
+ }
168
+ const anchorDir = getEnterpriseKnowledgePath(ownerSystemKey);
169
+ return path.join(anchorDir, GENERATED_DIR, DEFAULT_PREVIEW_FILE);
170
+ }
171
+
172
+ /**
173
+ * @param {import('../api/types/enterprise-knowledge.types').GenerateManifestResponse} preview
174
+ * @returns {void}
175
+ */
176
+ function logPreviewSummary(preview) {
177
+ headerKeyValue('Enterprise Knowledge manifest preview', preview.ownerSystemKey);
178
+ infoLine('Status', preview.previewOnly ? 'preview only (not published)' : 'unexpected');
179
+ infoLine('Version', preview.version || '1.0.0');
180
+ infoLine('Generated datasources', String((preview.externalDataSources || []).length));
181
+ const compilerCount = (preview.compilerFindings || []).length;
182
+ const trustCount = (preview.trustFindings || []).length;
183
+ if (compilerCount > 0) {
184
+ formatWarningLine(`${compilerCount} compiler finding(s) require review`);
185
+ }
186
+ if (trustCount > 0) {
187
+ formatWarningLine(`${trustCount} trust finding(s) require review`);
188
+ }
189
+ if (preview.message) {
190
+ logger.log(chalk.gray(preview.message));
191
+ }
192
+ }
193
+
194
+ /**
195
+ * @param {Object} options
196
+ * @returns {Promise<void>}
197
+ */
198
+ async function runGenerateManifestCommand(options) {
199
+ const domain = requireDomain(options.domain);
200
+ const ownerSystemKey = resolveOwnerSystemKey(domain, options.ownerSystemKey);
201
+ const body = buildGenerateManifestRequest(options, domain, ownerSystemKey);
202
+
203
+ const { dataplaneUrl, authConfig } = await resolveDataplaneAndAuth(ownerSystemKey, {
204
+ silent: true
205
+ });
206
+ const controllerUrl = await resolveControllerUrl();
207
+
208
+ let preview;
209
+ try {
210
+ preview = await postGenerateManifest(dataplaneUrl, authConfig, body, { controllerUrl });
211
+ } catch (error) {
212
+ throw new Error(formatApiError(error, dataplaneUrl));
213
+ }
214
+
215
+ if (options.json) {
216
+ logger.log(JSON.stringify(preview, null, 2));
217
+ return;
218
+ }
219
+
220
+ const outputPath = resolveOutputPath(ownerSystemKey, options.output);
221
+ mkdirSync(path.dirname(outputPath), { recursive: true });
222
+ writeFileSync(outputPath, `${JSON.stringify(preview, null, 2)}\n`, 'utf8');
223
+
224
+ logPreviewSummary(preview);
225
+ formatSuccessLine(`Preview written to ${outputPath}`);
226
+ logger.log(chalk.gray('Review and edit before upload (candidate) and deploy.'));
227
+ }
228
+
229
+ /**
230
+ * @param {import('commander').Command} ek
231
+ * @returns {void}
232
+ */
233
+ function setupGenerateManifestCommand(ek) {
234
+ ek.command('generate-manifest')
235
+ .description('Preview full Enterprise Knowledge manifest from published Connected Systems')
236
+ .addHelpText('after', GENERATE_MANIFEST_HELP_AFTER)
237
+ .requiredOption('--domain <domain>', 'Business domain slug (e.g. sales)')
238
+ .option('--owner-system-key <key>', 'Enterprise Knowledge anchor key (default ek-<domain>)')
239
+ .option('--source-system <key>', 'Published Connected System key (repeatable)', collectValues, [])
240
+ .option('--display-name <name>', 'Enterprise Knowledge display name override')
241
+ .option('--description <text>', 'Enterprise Knowledge description override')
242
+ .option('--version <semver>', 'Manifest version label', '1.0.0')
243
+ .option('--file <path>', 'Full request JSON (overrides built-in body)')
244
+ .option('--output <path>', 'Write preview JSON to this path')
245
+ .option('--json', 'Print preview JSON to stdout instead of writing a file')
246
+ .action(async(options) => {
247
+ try {
248
+ await runGenerateManifestCommand(options);
249
+ } catch (error) {
250
+ formatBlockingError(error.message || String(error));
251
+ process.exit(1);
252
+ }
253
+ });
254
+ }
255
+
256
+ /**
257
+ * @param {string} value
258
+ * @param {string[]} previous
259
+ * @returns {string[]}
260
+ */
261
+ function collectValues(value, previous) {
262
+ return previous.concat([value]);
263
+ }
264
+
265
+ /**
266
+ * @param {import('commander').Command} program
267
+ * @returns {void}
268
+ */
269
+ function setupEnterpriseKnowledgeCommands(program) {
270
+ const ek = program
271
+ .command('enterprise-knowledge')
272
+ .description('Enterprise Knowledge authoring helpers')
273
+ .addHelpText('after', ENTERPRISE_KNOWLEDGE_HELP_AFTER);
274
+ setupGenerateManifestCommand(ek);
275
+ }
276
+
277
+ module.exports = {
278
+ setupEnterpriseKnowledgeCommands,
279
+ runGenerateManifestCommand,
280
+ buildGenerateManifestRequest,
281
+ resolveOutputPath,
282
+ requireDomain,
283
+ resolveOwnerSystemKey
284
+ };
@@ -0,0 +1,250 @@
1
+ /**
2
+ * @fileoverview Evidence Fabrix v2 CLI leaf command registration.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const logger = require('../utils/logger');
10
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
11
+ const {
12
+ exitCodeForEvidenceError,
13
+ runEvidenceList,
14
+ runEvidenceGet,
15
+ runEvidenceInsert,
16
+ runEvidenceUpdate,
17
+ runEvidenceDelete,
18
+ runEvidenceLoad,
19
+ runEvidenceExport,
20
+ DEFAULT_BULK_FILE
21
+ } = require('../evidence/evidence-service');
22
+
23
+ const SHARED_OPTS = [
24
+ ['-e, --env <environment>', 'Environment key'],
25
+ ['--json', 'Machine-readable JSON output']
26
+ ];
27
+
28
+ const LIST_HELP = `
29
+
30
+ Examples:
31
+ $ aifabrix evidence list
32
+ $ aifabrix evidence list --resource-type deal --generic
33
+ $ aifabrix evidence list --role-key sales-executive --status active --json
34
+ `;
35
+
36
+ const GET_HELP = `
37
+
38
+ Examples:
39
+ $ aifabrix evidence get ev2_abc123
40
+ $ aifabrix evidence get ev2_abc123 --json
41
+ `;
42
+
43
+ const INSERT_HELP = `
44
+
45
+ Examples:
46
+ $ aifabrix evidence insert --resource-type deal --title "High-value review" --when "Amount over threshold" --expected-behavior "Procurement review first"
47
+ $ aifabrix evidence insert --file ./row.json
48
+ `;
49
+
50
+ const UPDATE_HELP = `
51
+
52
+ Examples:
53
+ $ aifabrix evidence update ev2_abc123 --title "Updated title"
54
+ $ aifabrix evidence update ev2_abc123 --file ./patch.json
55
+ `;
56
+
57
+ const DELETE_HELP = `
58
+
59
+ Examples:
60
+ $ aifabrix evidence delete ev2_abc123 --yes
61
+ $ aifabrix evidence delete ev2_abc123
62
+
63
+ Delete succeeds only when the row is not referenced by runtime execution.
64
+ `;
65
+
66
+ const LOAD_HELP = `
67
+
68
+ Examples:
69
+ $ aifabrix evidence load --file ${DEFAULT_BULK_FILE}
70
+ $ aifabrix evidence load --dry-run
71
+ `;
72
+
73
+ const EXPORT_HELP = `
74
+
75
+ Examples:
76
+ $ aifabrix evidence export --file ${DEFAULT_BULK_FILE}
77
+ $ aifabrix evidence export --resource-type deal --json
78
+ `;
79
+
80
+ /**
81
+ * @param {import('commander').Command} cmd
82
+ * @param {string} name
83
+ * @param {string} description
84
+ * @param {Function} action
85
+ * @param {Array<[string, string]>} extraOpts
86
+ * @param {string} helpAfter
87
+ */
88
+ function addEvidenceLeaf(cmd, name, description, action, extraOpts = [], helpAfter = '') {
89
+ const leaf = cmd.command(name).description(description);
90
+ for (const [flags, desc] of [...SHARED_OPTS, ...extraOpts]) {
91
+ leaf.option(flags, desc);
92
+ }
93
+ if (helpAfter) {
94
+ leaf.addHelpText('after', helpAfter);
95
+ }
96
+ leaf.action(async(...args) => {
97
+ try {
98
+ const code = await action(...args);
99
+ if (code && code !== 0) {
100
+ process.exit(code);
101
+ }
102
+ } catch (err) {
103
+ logger.error(formatBlockingError(err.message || String(err)));
104
+ process.exit(exitCodeForEvidenceError(err));
105
+ }
106
+ });
107
+ }
108
+
109
+ /**
110
+ * @param {import('commander').Command} evidence
111
+ */
112
+ function registerEvidenceList(evidence) {
113
+ addEvidenceLeaf(
114
+ evidence,
115
+ 'list',
116
+ 'List Evidence Fabrix v2 rows from the dataplane',
117
+ async(options) => runEvidenceList(options, logger),
118
+ [
119
+ ['--resource-type <resourceType>', 'Filter by resource type'],
120
+ ['--role-key <roleKey>', 'Filter by role-specific scope'],
121
+ ['--generic', 'Generic rows only (no roleKey)'],
122
+ ['--status <status>', 'Filter by active or disabled']
123
+ ],
124
+ LIST_HELP
125
+ );
126
+ }
127
+
128
+ /**
129
+ * @param {import('commander').Command} evidence
130
+ */
131
+ function registerEvidenceGet(evidence) {
132
+ addEvidenceLeaf(
133
+ evidence,
134
+ 'get <evidenceId>',
135
+ 'Get one evidence row by id',
136
+ async(evidenceId, options) => runEvidenceGet(evidenceId, options, logger),
137
+ [],
138
+ GET_HELP
139
+ );
140
+ }
141
+
142
+ /**
143
+ * @param {import('commander').Command} evidence
144
+ */
145
+ function registerEvidenceInsert(evidence) {
146
+ addEvidenceLeaf(
147
+ evidence,
148
+ 'insert',
149
+ 'Insert a new evidence row',
150
+ async(options) => runEvidenceInsert(options, logger),
151
+ [
152
+ ['--file <path>', 'Single evidence JSON object'],
153
+ ['--resource-type <resourceType>', 'Resource type key'],
154
+ ['--role-key <roleKey>', 'Optional role-specific scope'],
155
+ ['--generic', 'Create generic evidence (no roleKey)'],
156
+ ['--title <title>', 'Title'],
157
+ ['--description <description>', 'Description'],
158
+ ['--when <when>', 'Natural-language when condition'],
159
+ ['--expected-behavior <text>', 'Expected business behavior'],
160
+ ['--order <n>', 'Sort order within scope bucket', parseInt],
161
+ ['--status <status>', 'active or disabled']
162
+ ],
163
+ INSERT_HELP
164
+ );
165
+ }
166
+
167
+ /**
168
+ * @param {import('commander').Command} evidence
169
+ */
170
+ function registerEvidenceUpdate(evidence) {
171
+ addEvidenceLeaf(
172
+ evidence,
173
+ 'update <evidenceId>',
174
+ 'Update an evidence row',
175
+ async(evidenceId, options) => runEvidenceUpdate(evidenceId, options, logger),
176
+ [
177
+ ['--file <path>', 'Partial update JSON object'],
178
+ ['--role-key <roleKey>', 'Role-specific scope'],
179
+ ['--generic', 'Clear roleKey to generic scope'],
180
+ ['--title <title>', 'Title'],
181
+ ['--description <description>', 'Description'],
182
+ ['--when <when>', 'When condition'],
183
+ ['--expected-behavior <text>', 'Expected behavior'],
184
+ ['--order <n>', 'Sort order', parseInt],
185
+ ['--status <status>', 'active or disabled']
186
+ ],
187
+ UPDATE_HELP
188
+ );
189
+ }
190
+
191
+ /**
192
+ * @param {import('commander').Command} evidence
193
+ */
194
+ function registerEvidenceDelete(evidence) {
195
+ addEvidenceLeaf(
196
+ evidence,
197
+ 'delete <evidenceId>',
198
+ 'Delete evidence when it is not referenced by runtime execution',
199
+ async(evidenceId, options) => runEvidenceDelete(evidenceId, options, logger),
200
+ [['--yes', 'Skip confirmation prompt']],
201
+ DELETE_HELP
202
+ );
203
+ }
204
+
205
+ /**
206
+ * @param {import('commander').Command} evidence
207
+ */
208
+ function registerEvidenceLoad(evidence) {
209
+ addEvidenceLeaf(
210
+ evidence,
211
+ 'load',
212
+ 'Bulk insert or update evidence rows from a JSON array file',
213
+ async(options) => runEvidenceLoad(options, logger),
214
+ [
215
+ ['--file <path>', `JSON array file (default: ${DEFAULT_BULK_FILE})`],
216
+ ['--dry-run', 'Validate file without mutating dataplane']
217
+ ],
218
+ LOAD_HELP
219
+ );
220
+ }
221
+
222
+ /**
223
+ * @param {import('commander').Command} evidence
224
+ */
225
+ function registerEvidenceExport(evidence) {
226
+ addEvidenceLeaf(
227
+ evidence,
228
+ 'export',
229
+ 'Export filtered evidence rows to a JSON array file',
230
+ async(options) => runEvidenceExport(options, logger),
231
+ [
232
+ ['--file <path>', `Output file (default: ${DEFAULT_BULK_FILE})`],
233
+ ['--resource-type <resourceType>', 'Filter by resource type'],
234
+ ['--role-key <roleKey>', 'Filter by role-specific scope'],
235
+ ['--generic', 'Generic rows only'],
236
+ ['--status <status>', 'Filter by active or disabled']
237
+ ],
238
+ EXPORT_HELP
239
+ );
240
+ }
241
+
242
+ module.exports = {
243
+ registerEvidenceList,
244
+ registerEvidenceGet,
245
+ registerEvidenceInsert,
246
+ registerEvidenceUpdate,
247
+ registerEvidenceDelete,
248
+ registerEvidenceLoad,
249
+ registerEvidenceExport
250
+ };
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @fileoverview Evidence Fabrix v2 CLI commands.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const {
10
+ registerEvidenceList,
11
+ registerEvidenceGet,
12
+ registerEvidenceInsert,
13
+ registerEvidenceUpdate,
14
+ registerEvidenceDelete,
15
+ registerEvidenceLoad,
16
+ registerEvidenceExport
17
+ } = require('./evidence-cli-leaves');
18
+
19
+ const EVIDENCE_HELP_AFTER = `
20
+
21
+ Examples:
22
+ $ aifabrix evidence list --resource-type deal
23
+ $ aifabrix evidence insert --resource-type deal --title "Review threshold" --when "..." --expected-behavior "..."
24
+ $ aifabrix evidence export --file .evidence/evidence.json
25
+ $ aifabrix evidence load --file .evidence/evidence.json --dry-run
26
+ $ aifabrix evidence delete ev2_abc123 --yes
27
+
28
+ Per-command help: aifabrix evidence <command> --help
29
+ `;
30
+
31
+ /**
32
+ * @param {import('commander').Command} program
33
+ */
34
+ function setupEvidenceCommands(program) {
35
+ const evidence = program
36
+ .command('evidence')
37
+ .description('Manage Evidence Fabrix v2 rows on the dataplane')
38
+ .addHelpText('after', EVIDENCE_HELP_AFTER);
39
+
40
+ registerEvidenceList(evidence);
41
+ registerEvidenceGet(evidence);
42
+ registerEvidenceInsert(evidence);
43
+ registerEvidenceUpdate(evidence);
44
+ registerEvidenceDelete(evidence);
45
+ registerEvidenceLoad(evidence);
46
+ registerEvidenceExport(evidence);
47
+ }
48
+
49
+ module.exports = {
50
+ setupEvidenceCommands
51
+ };
@@ -9,7 +9,7 @@ const {
9
9
  syncLocalIfRequested
10
10
  } = require('./test-e2e-external');
11
11
  const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
12
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
12
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
13
13
  const { fetchDataplaneGeneralHealth } = require('../api/dataplane-health.api');
14
14
  const { formatNetworkError } = require('../utils/api-error-handler');
15
15
 
@@ -74,7 +74,7 @@ async function resolveGovernanceIntegrationContext(systemKey, options) {
74
74
  dataplaneUrl: options.dataplaneUrl
75
75
  };
76
76
  }
77
- if (!cliOptsSkipSync(options)) {
77
+ if (!cliOptsSkipPublish(options)) {
78
78
  const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
79
79
  if (uploadCtx?.authConfig && uploadCtx?.dataplaneUrl) {
80
80
  options.authConfig = uploadCtx.authConfig;
@@ -35,7 +35,7 @@ function normalizeGovernanceOptions(options, cmd) {
35
35
  return {
36
36
  env: options.env || parent.env || 'dev',
37
37
  verbose: options.verbose === true || parent.verbose === true,
38
- noSync: options.noSync === true || parent.noSync === true,
38
+ noPublish: options.noPublish === true || parent.noPublish === true,
39
39
  force: options.force === true || parent.force === true,
40
40
  json: options.json === true || parent.json === true,
41
41
  pack: options.pack,
@@ -109,7 +109,7 @@ async function governanceUploadHandler(systemKey, options, cmd) {
109
109
  async function governanceDownloadHandler(systemKey, options, cmd) {
110
110
  try {
111
111
  const opts = normalizeGovernanceOptions(options, cmd);
112
- opts.noSync = true;
112
+ opts.noPublish = true;
113
113
  const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
114
114
  if (opts.json) {
115
115
  logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @fileoverview Resolve governance subject emails from integration fixture CSV.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const path = require('path');
10
+ const { nodeFs } = require('../internal/node-fs');
11
+ const { getIntegrationPath } = require('../utils/paths');
12
+
13
+ /**
14
+ * @param {string} line
15
+ * @returns {string[]}
16
+ */
17
+ function parseCsvLine(line) {
18
+ const cells = [];
19
+ let current = '';
20
+ let inQuotes = false;
21
+ for (let index = 0; index < line.length; index += 1) {
22
+ const char = line[index];
23
+ if (char === '"') {
24
+ inQuotes = !inQuotes;
25
+ continue;
26
+ }
27
+ if (char === ',' && !inQuotes) {
28
+ cells.push(current.trim());
29
+ current = '';
30
+ continue;
31
+ }
32
+ current += char;
33
+ }
34
+ cells.push(current.trim());
35
+ return cells;
36
+ }
37
+
38
+ /**
39
+ * @param {string[]} lines
40
+ * @param {number} emailIndex
41
+ * @returns {string[]}
42
+ */
43
+ function collectUniqueEmailsFromRows(lines, emailIndex) {
44
+ const emails = [];
45
+ const seen = new Set();
46
+ for (let rowIndex = 1; rowIndex < lines.length; rowIndex += 1) {
47
+ const row = parseCsvLine(lines[rowIndex]);
48
+ const email = String(row[emailIndex] || '').trim().toLowerCase();
49
+ if (!email || seen.has(email)) {
50
+ continue;
51
+ }
52
+ seen.add(email);
53
+ emails.push(email);
54
+ }
55
+ return emails;
56
+ }
57
+
58
+ /**
59
+ * @param {string} systemKey
60
+ * @returns {string[]}
61
+ */
62
+ function resolveGovernanceFixtureSubjectEmails(systemKey) {
63
+ const integrationPath = getIntegrationPath(systemKey);
64
+ const csvPath = path.join(integrationPath, 'fixtures', 'session-users.csv');
65
+ const disk = nodeFs();
66
+ if (!disk.existsSync(csvPath)) {
67
+ return [];
68
+ }
69
+ const raw = disk.readFileSync(csvPath, 'utf8');
70
+ const lines = raw.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
71
+ if (lines.length < 2) {
72
+ return [];
73
+ }
74
+ const headers = parseCsvLine(lines[0]).map((header) => header.toLowerCase());
75
+ const emailIndex = headers.indexOf('email');
76
+ if (emailIndex < 0) {
77
+ return [];
78
+ }
79
+ return collectUniqueEmailsFromRows(lines, emailIndex);
80
+ }
81
+
82
+ module.exports = {
83
+ parseCsvLine,
84
+ resolveGovernanceFixtureSubjectEmails
85
+ };