@aifabrix/builder 2.49.2 → 2.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/.cursor/plans/157.1-security-quality-violations-by-type.csv +374 -0
  2. package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
  3. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  4. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  5. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  6. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  7. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  8. package/.cursor/skills/README.md +1 -0
  9. package/.dockerignore +52 -0
  10. package/.eslintignore +22 -0
  11. package/README.md +2 -0
  12. package/bin/builder-api-cleanup.js +26 -0
  13. package/bin/builder-api-nest.js +10 -0
  14. package/bin/builder-api-spike.js +19 -0
  15. package/enterprise-knowledge/README.md +50 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  21. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  22. package/integration/README.md +81 -0
  23. package/integration/github/README.md +53 -0
  24. package/integration/github/application.json +21 -0
  25. package/integration/github/deploy.js +72 -0
  26. package/integration/github/env.template +11 -0
  27. package/integration/github/github-datasource-issue-comments.json +239 -0
  28. package/integration/github/github-datasource-issues.json +399 -0
  29. package/integration/github/github-datasource-repository.json +354 -0
  30. package/integration/github/github-deploy.json +1202 -0
  31. package/integration/github/github-system.json +82 -0
  32. package/integration/hubspot-test/README.md +1 -1
  33. package/integration/hubspot-test/create-hubspot.js +1 -16
  34. package/jest.isolated-projects.js +31 -1
  35. package/jest.projects.js +87 -1
  36. package/lib/api/dev-server-https.js +1 -1
  37. package/lib/api/enterprise-knowledge.api.js +63 -0
  38. package/lib/api/evidence-kinds.api.js +128 -0
  39. package/lib/api/evidence.api.js +172 -0
  40. package/lib/api/external-systems.api.js +8 -2
  41. package/lib/api/pipeline.api.js +5 -1
  42. package/lib/api/resource-types.api.js +5 -4
  43. package/lib/api/roles.api.js +121 -0
  44. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  45. package/lib/api/types/evidence-kinds.types.js +42 -0
  46. package/lib/api/types/evidence.types.js +67 -0
  47. package/lib/api/types/resource-types.types.js +2 -0
  48. package/lib/api/types/roles.types.js +36 -0
  49. package/lib/app/certification-verify-rows.js +1 -1
  50. package/lib/app/controller-application-filter.js +36 -0
  51. package/lib/app/deploy.js +1 -1
  52. package/lib/app/list-external-systems.js +130 -0
  53. package/lib/app/list.js +20 -8
  54. package/lib/app/run.js +3 -1
  55. package/lib/app/show-display.js +8 -3
  56. package/lib/app/show-online.js +178 -0
  57. package/lib/app/show.js +39 -90
  58. package/lib/build/builder-api-docker-staging.js +47 -0
  59. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  60. package/lib/build/standard-docker-build.js +2 -0
  61. package/lib/certification/merge-certification-from-artifact.js +1 -1
  62. package/lib/certification/post-unified-cert-sync.js +4 -31
  63. package/lib/certification/sync-after-external-command.js +0 -1
  64. package/lib/certification/sync-system-certification.js +0 -3
  65. package/lib/channels/add-channel.js +40 -34
  66. package/lib/channels/approval-guides/chatgpt.js +33 -0
  67. package/lib/channels/approval-guides/credential-portal.js +38 -0
  68. package/lib/channels/approval-guides/index.js +110 -0
  69. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  70. package/lib/channels/approval-guides/slack.js +34 -0
  71. package/lib/channels/approval-guides/teams-bot.js +35 -0
  72. package/lib/channels/approval-guides/web-embed.js +32 -0
  73. package/lib/channels/channel-approval-guide.js +11 -0
  74. package/lib/channels/channel-artifact-generator.js +18 -5
  75. package/lib/channels/channel-audit.js +3 -0
  76. package/lib/channels/channel-auth-context.js +1 -1
  77. package/lib/channels/channel-description.js +59 -0
  78. package/lib/channels/channel-integration-generator.js +13 -230
  79. package/lib/channels/channel-integration-template.js +94 -0
  80. package/lib/channels/channel-runtime-resolver.js +43 -3
  81. package/lib/channels/channel-status-display.js +66 -26
  82. package/lib/channels/channel-targets.js +3 -3
  83. package/lib/cli/index.js +31 -3
  84. package/lib/cli/infra-guided.js +5 -1
  85. package/lib/cli/setup-app-external-create.js +111 -0
  86. package/lib/cli/setup-app.help.js +1 -1
  87. package/lib/cli/setup-app.js +60 -130
  88. package/lib/cli/setup-app.test-commands.js +26 -52
  89. package/lib/cli/setup-certification-commands.js +4 -4
  90. package/lib/cli/setup-certification.help.js +9 -9
  91. package/lib/cli/setup-dev.js +30 -9
  92. package/lib/cli/setup-external-system-help.js +4 -6
  93. package/lib/cli/setup-external-system.js +58 -52
  94. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  95. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  96. package/lib/cli/setup-infra.js +15 -0
  97. package/lib/cli/setup-list.js +43 -0
  98. package/lib/cli/setup-utility-help-after.js +12 -0
  99. package/lib/cli/setup-utility-repair.js +26 -7
  100. package/lib/cli/setup-utility-validate.js +41 -2
  101. package/lib/cli/setup-utility.js +5 -3
  102. package/lib/commands/app.js +15 -43
  103. package/lib/commands/channel-add-setup.js +110 -0
  104. package/lib/commands/channel.js +42 -8
  105. package/lib/commands/datasource-sync-display.js +96 -0
  106. package/lib/commands/datasource-sync-policy.js +210 -0
  107. package/lib/commands/datasource-test-trust-cli.js +6 -6
  108. package/lib/commands/datasource-unified-test-cli.js +2 -1
  109. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  110. package/lib/commands/deploy-gate-failure-details.js +184 -0
  111. package/lib/commands/deploy-gate-orchestrator.js +368 -0
  112. package/lib/commands/dev-cli-handlers.js +7 -62
  113. package/lib/commands/dev-host-ops-params.js +91 -0
  114. package/lib/commands/dev-host-ops-poll.js +111 -0
  115. package/lib/commands/dev-host-ops.js +107 -94
  116. package/lib/commands/dev-init.js +6 -106
  117. package/lib/commands/dev-refresh.js +197 -0
  118. package/lib/commands/enterprise-knowledge.js +284 -0
  119. package/lib/commands/evidence-cli-leaves.js +250 -0
  120. package/lib/commands/evidence-kind.js +428 -0
  121. package/lib/commands/evidence.js +51 -0
  122. package/lib/commands/governance-cli-shared.js +2 -2
  123. package/lib/commands/governance-command-action.js +5 -3
  124. package/lib/commands/governance-fixture-subjects.js +85 -0
  125. package/lib/commands/governance.js +1 -1
  126. package/lib/commands/lifecycle-command-action.js +2 -2
  127. package/lib/commands/lifecycle-external.js +3 -3
  128. package/lib/commands/manifest-cli-auth.js +29 -0
  129. package/lib/commands/manifest-cli-commands.js +170 -0
  130. package/lib/commands/manifest-cli-integration-path.js +63 -0
  131. package/lib/commands/manifest.js +21 -0
  132. package/lib/commands/protection-cli-leaves.js +3 -3
  133. package/lib/commands/repair-auth-apply.js +15 -1
  134. package/lib/commands/repair-authentications-454.js +169 -0
  135. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  136. package/lib/commands/repair-datasource-apply.js +135 -0
  137. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  138. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  139. package/lib/commands/repair-datasource-operation-security.js +180 -0
  140. package/lib/commands/repair-datasource-run.js +7 -2
  141. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  142. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  143. package/lib/commands/repair-datasource.js +12 -68
  144. package/lib/commands/repair-env-template.js +11 -1
  145. package/lib/commands/repair-external-run.js +121 -31
  146. package/lib/commands/repair-internal.js +1 -1
  147. package/lib/commands/repair-openapi-export.js +156 -0
  148. package/lib/commands/repair-openapi-sync.js +33 -8
  149. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  150. package/lib/commands/repair-persist.js +22 -1
  151. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  152. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  153. package/lib/commands/repair-rbac.js +163 -86
  154. package/lib/commands/repair-steps.js +83 -18
  155. package/lib/commands/repair-system-permissions.js +1 -0
  156. package/lib/commands/repair.js +1 -1
  157. package/lib/commands/resource-type.js +166 -44
  158. package/lib/commands/role.js +452 -0
  159. package/lib/commands/run-post-publish-data-sync.js +68 -0
  160. package/lib/commands/setup-modes.js +1 -1
  161. package/lib/commands/setup.js +1 -1
  162. package/lib/commands/test-e2e-external.js +21 -8
  163. package/lib/commands/test-governance-cli-options.js +2 -2
  164. package/lib/commands/test-trust-cli-options.js +2 -2
  165. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  166. package/lib/commands/up-builder-api-provision.js +241 -0
  167. package/lib/commands/up-builder-api.js +88 -0
  168. package/lib/commands/up-common.js +25 -1
  169. package/lib/commands/upload-credential-push-log.js +117 -0
  170. package/lib/commands/upload-data-sync-finalize.js +60 -0
  171. package/lib/commands/upload-probe.js +66 -0
  172. package/lib/commands/upload-publish-context.js +4 -1
  173. package/lib/commands/upload-sidecar-followups.js +55 -27
  174. package/lib/commands/upload.js +116 -157
  175. package/lib/commands/validate-json.js +230 -0
  176. package/lib/commands/verify-governance-combined-external.js +1 -1
  177. package/lib/commands/verify-governance-db.js +2 -2
  178. package/lib/commands/verify-operations-command-action.js +2 -2
  179. package/lib/commands/verify-operations-step-plan.js +79 -41
  180. package/lib/commands/verify-operations-steps.js +2 -2
  181. package/lib/commands/verify-trust-command-action.js +1 -1
  182. package/lib/commands/wizard-core.js +1 -1
  183. package/lib/commands/wizard-headless.js +2 -1
  184. package/lib/core/admin-secrets.js +2 -6
  185. package/lib/core/audit-logger.js +1 -1
  186. package/lib/core/secrets-env-content.js +10 -4
  187. package/lib/core/secrets-env-write.js +2 -13
  188. package/lib/core/secrets-load.js +1 -3
  189. package/lib/datasource/agent-trust-run.js +3 -3
  190. package/lib/datasource/capability/relate-operations.js +1 -1
  191. package/lib/datasource/deploy.js +3 -1
  192. package/lib/datasource/test-e2e.js +6 -1
  193. package/lib/datasource/unified-validation-run-body.js +4 -1
  194. package/lib/datasource/unified-validation-run.js +1 -1
  195. package/lib/deployment/deploy-poll-ui.js +73 -12
  196. package/lib/deployment/deployer-poll-run.js +113 -0
  197. package/lib/deployment/deployer.js +17 -87
  198. package/lib/evidence/dataplane-context.js +21 -0
  199. package/lib/evidence/evidence-display.js +78 -0
  200. package/lib/evidence/evidence-service.js +392 -0
  201. package/lib/external-system/deploy.js +290 -112
  202. package/lib/external-system/download.js +7 -3
  203. package/lib/external-system/test-execution.js +1 -1
  204. package/lib/external-system/test-system-level.js +8 -10
  205. package/lib/external-system/test.js +12 -6
  206. package/lib/generator/deploy-script.js +73 -0
  207. package/lib/generator/external.js +2 -1
  208. package/lib/generator/helpers.js +13 -5
  209. package/lib/generator/index.js +17 -2
  210. package/lib/generator/split-variables.js +9 -3
  211. package/lib/generator/wizard.js +3 -36
  212. package/lib/infrastructure/helpers-docker-check.js +6 -0
  213. package/lib/infrastructure/helpers.js +1 -1
  214. package/lib/internal/fs-real-sync.js +22 -1
  215. package/lib/internal/node-fs.js +2 -0
  216. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  217. package/lib/lifecycle/verify-step-progress.js +1 -1
  218. package/lib/programmatic/access-log.js +26 -0
  219. package/lib/programmatic/auth-config.js +45 -0
  220. package/lib/programmatic/bearer-auth.js +176 -0
  221. package/lib/programmatic/builder-api-request.js +175 -0
  222. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  223. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  224. package/lib/programmatic/builder-api-server.js +230 -0
  225. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  226. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  227. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  228. package/lib/programmatic/builder-help-envelope.js +36 -0
  229. package/lib/programmatic/builder-help-fixtures.js +200 -0
  230. package/lib/programmatic/builder-help-governance.js +172 -0
  231. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  232. package/lib/programmatic/builder-help.js +361 -0
  233. package/lib/programmatic/capability-registry.js +77 -0
  234. package/lib/programmatic/command-options.js +32 -0
  235. package/lib/programmatic/enterprise-mcp-client.js +114 -0
  236. package/lib/programmatic/http-problem-details.js +99 -0
  237. package/lib/programmatic/http-route-match.js +40 -0
  238. package/lib/programmatic/idempotency-cache.js +69 -0
  239. package/lib/programmatic/index.js +53 -0
  240. package/lib/programmatic/integration-path-scope.js +39 -0
  241. package/lib/programmatic/log-redaction.js +66 -0
  242. package/lib/programmatic/manifest-get-section.js +146 -0
  243. package/lib/programmatic/manifest-patch-section.js +252 -0
  244. package/lib/programmatic/manifest-repair.js +122 -0
  245. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  246. package/lib/programmatic/manifest-section-io.js +225 -0
  247. package/lib/programmatic/manifest-section-quality.js +171 -0
  248. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  249. package/lib/programmatic/manifest-section-registry.js +222 -0
  250. package/lib/programmatic/nest-http-bridge.js +34 -0
  251. package/lib/programmatic/openapi-component-schemas.js +68 -0
  252. package/lib/programmatic/openapi-description-enricher.js +117 -0
  253. package/lib/programmatic/openapi-descriptions.js +190 -0
  254. package/lib/programmatic/openapi-docs-serving.js +123 -0
  255. package/lib/programmatic/openapi-help-schemas.js +63 -0
  256. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  258. package/lib/programmatic/openapi-request-schemas.js +155 -0
  259. package/lib/programmatic/openapi-result-schemas.js +493 -0
  260. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  261. package/lib/programmatic/openapi-schema-descriptions-core.js +162 -0
  262. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  263. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  264. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  265. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  266. package/lib/programmatic/openapi-schema-helpers.js +108 -0
  267. package/lib/programmatic/openapi-spec.js +203 -0
  268. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  269. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  270. package/lib/programmatic/request-timeout.js +53 -0
  271. package/lib/programmatic/route-handler-map.js +143 -0
  272. package/lib/programmatic/route-handlers-context.js +29 -0
  273. package/lib/programmatic/route-handlers.js +33 -0
  274. package/lib/programmatic/run-certify.js +57 -0
  275. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  276. package/lib/programmatic/run-lifecycle.js +29 -0
  277. package/lib/programmatic/run-repair.js +41 -0
  278. package/lib/programmatic/run-repository-emcp.js +62 -0
  279. package/lib/programmatic/run-template-workspace.js +74 -0
  280. package/lib/programmatic/run-test.js +49 -0
  281. package/lib/programmatic/run-upload.js +63 -0
  282. package/lib/programmatic/run-validate.js +53 -0
  283. package/lib/programmatic/run-wizard.js +40 -0
  284. package/lib/programmatic/system-key.js +48 -0
  285. package/lib/programmatic/wizard-config-normalize.js +118 -0
  286. package/lib/programmatic/workspace-cleanup.js +128 -0
  287. package/lib/programmatic/workspace-context.js +145 -0
  288. package/lib/programmatic/workspace-lock.js +75 -0
  289. package/lib/programmatic/workspace-meta.js +64 -0
  290. package/lib/programmatic/workspace-ops.js +149 -0
  291. package/lib/protection/run-commands-upload-sync.js +35 -0
  292. package/lib/protection/run-commands.js +2 -20
  293. package/lib/protection/upload-batch.js +11 -7
  294. package/lib/resolvers/evidence-kind-file.js +230 -0
  295. package/lib/resolvers/resource-type-file.js +58 -1
  296. package/lib/resolvers/role-file.js +227 -0
  297. package/lib/schema/application-schema.json +22 -2
  298. package/lib/schema/external-datasource.schema.json +245 -2
  299. package/lib/schema/external-system.schema.json +259 -119
  300. package/lib/schema/flag-map-validation-run.json +3 -0
  301. package/lib/schema/infra.parameter.yaml +25 -1
  302. package/lib/schema/type/credential-field-registry.json +21 -5
  303. package/lib/schema/type/document-storage.json +9 -0
  304. package/lib/utils/agent-trust-run-display.js +1 -1
  305. package/lib/utils/api.js +8 -2
  306. package/lib/utils/app-path-resolve.js +168 -0
  307. package/lib/utils/app-register-config.js +4 -3
  308. package/lib/utils/authentication-env-template.js +222 -0
  309. package/lib/utils/cli-sync-options.js +62 -10
  310. package/lib/utils/cli-utils.js +15 -3
  311. package/lib/utils/cli-workspace-options.js +29 -0
  312. package/lib/utils/compose-generate-docker-compose.js +102 -0
  313. package/lib/utils/configuration-env-resolver.js +203 -27
  314. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  315. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  316. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  317. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  318. package/lib/utils/datasource-test-run-display.js +2 -1
  319. package/lib/utils/dev-ca-install.js +5 -6
  320. package/lib/utils/dev-config.js +2 -2
  321. package/lib/utils/dev-init-ssh-merge.js +165 -23
  322. package/lib/utils/dev-list-sort.js +145 -0
  323. package/lib/utils/dev-pin-share-instructions.js +110 -0
  324. package/lib/utils/dev-platform-tls.js +0 -63
  325. package/lib/utils/dev-ssh-config-helper.js +177 -33
  326. package/lib/utils/docker-build.js +46 -27
  327. package/lib/utils/docker-daemon-tls-ca.js +1 -1
  328. package/lib/utils/docker-exec.js +91 -6
  329. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  330. package/lib/utils/env-copy.js +3 -4
  331. package/lib/utils/env-dotenv-format.js +103 -0
  332. package/lib/utils/error-formatters/error-parser.js +0 -3
  333. package/lib/utils/external-env-template.js +5 -2
  334. package/lib/utils/external-system-display.js +5 -1
  335. package/lib/utils/external-system-readiness-compact-blocks.js +248 -0
  336. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  337. package/lib/utils/external-system-readiness-core.js +16 -0
  338. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  339. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  340. package/lib/utils/external-system-readiness-display.js +20 -30
  341. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  342. package/lib/utils/external-system-system-test-tty.js +5 -41
  343. package/lib/utils/health-check-request.js +2 -3
  344. package/lib/utils/help-builder.js +9 -1
  345. package/lib/utils/host-ops-job-labels.js +236 -0
  346. package/lib/utils/host-ops-job-result.js +61 -0
  347. package/lib/utils/host-ops-poll-ui.js +163 -0
  348. package/lib/utils/image-name.js +22 -4
  349. package/lib/utils/integration-path-resolve.js +112 -0
  350. package/lib/utils/logger.js +37 -4
  351. package/lib/utils/manifest-source-emit.js +1 -1
  352. package/lib/utils/paths-reload-source.js +148 -0
  353. package/lib/utils/paths-system-builder-keys.js +25 -0
  354. package/lib/utils/paths.js +183 -30
  355. package/lib/utils/pipeline-upload-auth-retry.js +4 -0
  356. package/lib/utils/postgres-platform-bootstrap.js +24 -17
  357. package/lib/utils/postgres-wipe.js +5 -2
  358. package/lib/utils/remote-dev-auth.js +39 -4
  359. package/lib/utils/resolve-docker-image-ref.js +36 -6
  360. package/lib/utils/runtime-configuration-values.js +64 -2
  361. package/lib/utils/secrets-helpers.js +5 -1
  362. package/lib/utils/ssh-known-hosts.js +130 -0
  363. package/lib/utils/test-target-cli-options.js +75 -0
  364. package/lib/utils/token-manager.js +16 -0
  365. package/lib/utils/upload-sync-options.js +20 -2
  366. package/lib/utils/validation-run-request.js +11 -2
  367. package/lib/validation/external-manifest-validator.js +11 -1
  368. package/lib/validation/openapi-contract-surface-validator.js +430 -0
  369. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  370. package/lib/validation/validate-external-file.js +160 -0
  371. package/lib/validation/validate.js +6 -117
  372. package/lib/validation/validator.js +6 -5
  373. package/package.json +76 -37
  374. package/packages/builder-api/README.md +120 -0
  375. package/packages/builder-api/package.json +30 -0
  376. package/packages/builder-api/src/app.module.ts +7 -0
  377. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  378. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  379. package/packages/builder-api/src/main.ts +16 -0
  380. package/packages/builder-api/tsconfig.json +15 -0
  381. package/scripts/check-builder-api-architecture-grep.js +79 -0
  382. package/scripts/docker_image_content_gate.js +47 -0
  383. package/scripts/docker_image_content_gate.sh +5 -0
  384. package/scripts/export-builder-api-evidence.js +262 -0
  385. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  386. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  387. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  388. package/scripts/lib/plan-actor.js +109 -0
  389. package/scripts/lib/plan-config.js +20 -0
  390. package/scripts/lib/plan-gates.js +154 -0
  391. package/scripts/lib/plan-meta.js +104 -0
  392. package/scripts/lib/plan-parse.js +162 -0
  393. package/scripts/lib/plan-prevalidate-gates.js +337 -0
  394. package/scripts/lib/plan-run-core.js +125 -0
  395. package/scripts/lib/plan-run-report.js +119 -0
  396. package/scripts/plan-approve.js +24 -0
  397. package/scripts/plan-archive.js +49 -0
  398. package/scripts/plan-run.js +13 -0
  399. package/scripts/plan-set-actor.js +21 -0
  400. package/scripts/plan-validate.js +80 -0
  401. package/scripts/pnpm/af.mjs +110 -0
  402. package/scripts/pnpm/check-quiet.mjs +32 -0
  403. package/scripts/pnpm/dev-install.mjs +29 -0
  404. package/scripts/pnpm/dev-reload.mjs +18 -0
  405. package/scripts/pnpm/help.mjs +55 -0
  406. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  407. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  408. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  409. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  410. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  411. package/scripts/pnpm/lib/spinner.mjs +42 -0
  412. package/scripts/stage_builder_api_for_docker.js +65 -0
  413. package/scripts/sync-builder-api-template.js +44 -0
  414. package/templates/README.md +3 -0
  415. package/templates/applications/builder-api/Dockerfile +38 -0
  416. package/templates/applications/builder-api/application.yaml +75 -0
  417. package/templates/applications/builder-api/env.template +48 -0
  418. package/templates/applications/dataplane/application.yaml +27 -5
  419. package/templates/applications/dataplane/env.template +38 -15
  420. package/templates/applications/dataplane/rbac.yaml +85 -3
  421. package/templates/applications/miso-controller/application.yaml +10 -1
  422. package/templates/applications/miso-controller/env.template +11 -10
  423. package/templates/applications/miso-controller/rbac.yaml +72 -0
  424. package/templates/channels/README.md +18 -0
  425. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  426. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  427. package/templates/channels/chatgpt/integration/README.md +11 -0
  428. package/templates/channels/chatgpt/integration/application.json +15 -0
  429. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  430. package/templates/channels/chatgpt/integration/env.template +4 -0
  431. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  432. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  433. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  434. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  435. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  436. package/templates/channels/slack/install.template.md.hbs +48 -18
  437. package/templates/channels/slack/integration/README.md +38 -0
  438. package/templates/channels/slack/integration/application.json +18 -0
  439. package/templates/channels/slack/integration/env.template +29 -0
  440. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  441. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  442. package/templates/channels/slack/integration/slack-system.json +144 -0
  443. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  444. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  445. package/templates/channels/teams-bot/integration/README.md +18 -0
  446. package/templates/channels/teams-bot/integration/application.json +17 -0
  447. package/templates/channels/teams-bot/integration/env.template +5 -0
  448. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  449. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  450. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  451. package/templates/channels/web-embed/integration/README.md +11 -0
  452. package/templates/channels/web-embed/integration/application.json +15 -0
  453. package/templates/channels/web-embed/integration/env.template +4 -0
  454. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  455. package/templates/openapi/redoc_page.html +86 -0
  456. package/templates/python/docker-compose.hbs +11 -0
  457. package/templates/python/requirements.txt +2 -2
  458. package/templates/typescript/docker-compose.hbs +11 -0
  459. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,428 @@
1
+ /**
2
+ * Evidence kind catalog commands (Controller).
3
+ *
4
+ * Commands:
5
+ * - aifabrix evidence-kind create|import|export|get|list
6
+ *
7
+ * Distinct from `aifabrix evidence` (Evidence Fabrix v2 rows).
8
+ *
9
+ * @fileoverview Evidence kind catalog CLI commands
10
+ * @author AI Fabrix Team
11
+ * @version 1.0.0
12
+ */
13
+
14
+ 'use strict';
15
+
16
+ const chalk = require('chalk');
17
+ const logger = require('../utils/logger');
18
+ const { resolveControllerUrl } = require('../utils/controller-url');
19
+ const { normalizeControllerUrl, resolveEnvironment } = require('../core/config');
20
+ const { getOrRefreshDeviceToken } = require('../utils/token-manager');
21
+ const {
22
+ readEvidenceKindCreateFile,
23
+ readEvidenceKindCatalogFile,
24
+ writeEvidenceKindCatalogFile,
25
+ mapEvidenceKindFileToApiPayload,
26
+ mapEvidenceKindApiToFileRow
27
+ } = require('../resolvers/evidence-kind-file');
28
+ const {
29
+ formatBlockingError,
30
+ formatSuccessLine,
31
+ infoLine,
32
+ headerKeyValue
33
+ } = require('../utils/cli-layout-chalk');
34
+ const {
35
+ listEvidenceKinds,
36
+ getEvidenceKind,
37
+ createEvidenceKindIdempotent
38
+ } = require('../api/evidence-kinds.api');
39
+
40
+ const EVIDENCE_KIND_KEY_PATTERN = /^[a-z][a-z0-9_]*$/;
41
+
42
+ const EVIDENCE_KIND_HELP_AFTER = `
43
+
44
+ Examples:
45
+ $ aifabrix evidence-kind create --key obligation --display-name "Obligation" --domain governance --purpose "Track commitments"
46
+ $ aifabrix evidence-kind get obligation
47
+ $ aifabrix evidence-kind list --search risk
48
+
49
+ Per-command help: aifabrix evidence-kind <command> --help
50
+ `;
51
+
52
+ const EVIDENCE_KIND_IMPORT_HELP_AFTER = `
53
+
54
+ Examples:
55
+ $ aifabrix evidence-kind import --file ./baseline-evidence-kinds.json
56
+ `;
57
+
58
+ const EVIDENCE_KIND_EXPORT_HELP_AFTER = `
59
+
60
+ Examples:
61
+ $ aifabrix evidence-kind export --file ./evidence-kinds-export.json
62
+ `;
63
+
64
+ const EVIDENCE_KIND_CREATE_HELP_AFTER = `
65
+
66
+ Examples:
67
+ $ aifabrix evidence-kind create --key obligation --display-name "Obligation" --domain governance --purpose "Track commitments"
68
+ $ aifabrix evidence-kind create --key risk --display-name "Risk" --domain governance --purpose "..." --default-severity high
69
+ $ aifabrix evidence-kind create --file ./obligation.json
70
+ `;
71
+
72
+ const EVIDENCE_KIND_GET_HELP_AFTER = `
73
+
74
+ Examples:
75
+ $ aifabrix evidence-kind get obligation
76
+ $ aifabrix evidence-kind get clx1234567890abcdef
77
+ `;
78
+
79
+ const EVIDENCE_KIND_LIST_HELP_AFTER = `
80
+
81
+ Examples:
82
+ $ aifabrix evidence-kind list
83
+ $ aifabrix evidence-kind list --page 1 --page-size 50
84
+ $ aifabrix evidence-kind list --search risk
85
+ `;
86
+
87
+ /**
88
+ * @param {string} raw
89
+ * @returns {string}
90
+ */
91
+ function requireEvidenceKindKey(raw) {
92
+ const key = String(raw || '').trim();
93
+ if (!key) {
94
+ throw new Error('Evidence kind key is required (--key <key> or --file <path>).');
95
+ }
96
+ if (!EVIDENCE_KIND_KEY_PATTERN.test(key)) {
97
+ throw new Error(
98
+ 'Evidence kind key must start with a lowercase letter and contain only lowercase letters, numbers, and underscores.'
99
+ );
100
+ }
101
+ return key;
102
+ }
103
+
104
+ /**
105
+ * @param {Object} _options
106
+ * @returns {Promise<{ controllerUrl: string, authConfig: Object }>}
107
+ */
108
+ async function resolveControllerAndAuth(_options) {
109
+ const controllerUrl = await resolveControllerUrl();
110
+ if (!controllerUrl) {
111
+ throw new Error('Controller URL is required. Run "aifabrix login" first.');
112
+ }
113
+ const normalized = normalizeControllerUrl(controllerUrl);
114
+ const deviceToken = await getOrRefreshDeviceToken(normalized);
115
+ if (!deviceToken || !deviceToken.token) {
116
+ throw new Error(
117
+ `Not authenticated for controller: ${controllerUrl}. ` +
118
+ 'Run "aifabrix login" and try again.'
119
+ );
120
+ }
121
+ return {
122
+ controllerUrl: deviceToken.controller || normalized,
123
+ authConfig: { type: 'bearer', token: deviceToken.token }
124
+ };
125
+ }
126
+
127
+ async function resolveHeaderContext() {
128
+ const env = await resolveEnvironment();
129
+ const controllerUrl = await resolveControllerUrl();
130
+ const normalized = normalizeControllerUrl(controllerUrl);
131
+ return { environment: env || 'dev', controllerUrl: normalized };
132
+ }
133
+
134
+ /**
135
+ * @param {Object} response
136
+ * @returns {any}
137
+ */
138
+ function unwrapControllerData(response) {
139
+ return response?.data?.data ?? response?.data ?? response;
140
+ }
141
+
142
+ /**
143
+ * Build create payload from flags and optional --file (maps domain → domainKey).
144
+ * @param {Object} options
145
+ * @returns {Object}
146
+ */
147
+ function buildCreatePayload(options) {
148
+ let base = {};
149
+ if (options.file) {
150
+ base = readEvidenceKindCreateFile(options.file);
151
+ }
152
+ const merged = { ...base };
153
+ if (options.key) merged.key = options.key;
154
+ if (options.displayName) merged.displayName = options.displayName;
155
+ if (options.description !== undefined) merged.description = options.description;
156
+ if (options.purpose !== undefined) merged.purpose = options.purpose;
157
+ if (options.expectedUse !== undefined) merged.expectedUse = options.expectedUse;
158
+ if (options.defaultSeverity) merged.defaultSeverity = options.defaultSeverity;
159
+ if (options.domain) {
160
+ merged.domain = options.domain;
161
+ delete merged.domainKey;
162
+ }
163
+ if (options.file && !options.domain && base.domainKey) {
164
+ return { ...base, key: requireEvidenceKindKey(merged.key || base.key) };
165
+ }
166
+ const payload = mapEvidenceKindFileToApiPayload(
167
+ {
168
+ ...merged,
169
+ domain: merged.domain || merged.domainKey
170
+ },
171
+ 0
172
+ );
173
+ payload.key = requireEvidenceKindKey(payload.key);
174
+ return payload;
175
+ }
176
+
177
+ /**
178
+ * @param {Object[]} rows
179
+ * @param {string} controllerUrl
180
+ * @param {Object} authConfig
181
+ * @returns {Promise<{ created: number, existed: number, total: number }>}
182
+ */
183
+ async function importEvidenceKindRows(rows, controllerUrl, authConfig) {
184
+ let created = 0;
185
+ let existed = 0;
186
+ for (const payload of rows) {
187
+ payload.key = requireEvidenceKindKey(payload.key);
188
+ const out = await createEvidenceKindIdempotent(controllerUrl, authConfig, payload);
189
+ if (out.created) {
190
+ created += 1;
191
+ continue;
192
+ }
193
+ existed += 1;
194
+ }
195
+ return { created, existed, total: rows.length };
196
+ }
197
+
198
+ /**
199
+ * @param {string} controllerUrl
200
+ * @param {Object} authConfig
201
+ * @returns {Promise<Object[]>}
202
+ */
203
+ async function fetchAllEvidenceKinds(controllerUrl, authConfig) {
204
+ const all = [];
205
+ let page = 1;
206
+ const pageSize = 100;
207
+ for (;;) {
208
+ const res = await listEvidenceKinds(controllerUrl, authConfig, { page, pageSize });
209
+ const payload = unwrapControllerData(res);
210
+ const items = payload?.data ?? payload ?? [];
211
+ if (!Array.isArray(items) || items.length === 0) {
212
+ break;
213
+ }
214
+ all.push(...items);
215
+ if (items.length < pageSize) {
216
+ break;
217
+ }
218
+ page += 1;
219
+ }
220
+ return all;
221
+ }
222
+
223
+ function setupEvidenceKindImportCommand(cmd) {
224
+ cmd
225
+ .command('import')
226
+ .description('Import evidence kinds from baseline JSON (idempotent)')
227
+ .addHelpText('after', EVIDENCE_KIND_IMPORT_HELP_AFTER)
228
+ .requiredOption('--file <path>', 'Baseline catalog (evidenceKinds[]) or JSON array')
229
+ .action(async(options) => {
230
+ try {
231
+ const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
232
+ const rows = readEvidenceKindCatalogFile(options.file);
233
+ const summary = await importEvidenceKindRows(rows, controllerUrl, authConfig);
234
+ logger.log(
235
+ formatSuccessLine(
236
+ `Evidence kinds imported: ${summary.total} total ` +
237
+ `(${summary.created} created, ${summary.existed} already existed)`
238
+ )
239
+ );
240
+ } catch (e) {
241
+ logger.error(formatBlockingError(e.message));
242
+ process.exit(1);
243
+ }
244
+ });
245
+ }
246
+
247
+ function setupEvidenceKindExportCommand(cmd) {
248
+ cmd
249
+ .command('export')
250
+ .description('Export evidence kinds to baseline-shaped JSON')
251
+ .addHelpText('after', EVIDENCE_KIND_EXPORT_HELP_AFTER)
252
+ .requiredOption('--file <path>', 'Output path for baseline catalog JSON')
253
+ .action(async(options) => {
254
+ try {
255
+ const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
256
+ const records = await fetchAllEvidenceKinds(controllerUrl, authConfig);
257
+ const rows = records.map(mapEvidenceKindApiToFileRow);
258
+ writeEvidenceKindCatalogFile(options.file, rows);
259
+ logger.log(
260
+ formatSuccessLine(`Evidence kinds exported: ${rows.length} written to ${options.file}`)
261
+ );
262
+ } catch (e) {
263
+ logger.error(formatBlockingError(e.message));
264
+ process.exit(1);
265
+ }
266
+ });
267
+ }
268
+
269
+ function setupEvidenceKindCreateCommand(cmd) {
270
+ cmd
271
+ .command('create')
272
+ .description('Create evidence kind (idempotent; success if it already exists)')
273
+ .addHelpText('after', EVIDENCE_KIND_CREATE_HELP_AFTER)
274
+ .option('--file <path>', 'Read evidence kind create payload from JSON file')
275
+ .option('--key <key>', 'Catalog key (lowercase letters, digits, underscores)')
276
+ .option('--display-name <name>', 'Display name')
277
+ .option('--domain <domain>', 'Enterprise domain key (e.g. governance, sales)')
278
+ .option('--purpose <text>', 'Evidence kind purpose (required)')
279
+ .option('--expected-use <text>', 'Expected use guidance')
280
+ .option('--default-severity <level>', 'low | medium | high | critical')
281
+ .option('--description <text>', 'Description')
282
+ .action(async(options) => {
283
+ try {
284
+ const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
285
+ const payload = buildCreatePayload(options);
286
+ const out = await createEvidenceKindIdempotent(controllerUrl, authConfig, payload);
287
+ const row = unwrapControllerData(out.response);
288
+ const domain = row.domainKey || payload.domainKey || '—';
289
+ if (out.created) {
290
+ logger.log(formatSuccessLine(`Evidence kind created: ${row.key} (domain: ${domain})`));
291
+ return;
292
+ }
293
+ logger.log(formatSuccessLine(`Evidence kind exists: ${row.key} (domain: ${domain})`));
294
+ logger.log(infoLine('No changes were needed.'));
295
+ } catch (e) {
296
+ logger.error(formatBlockingError(e.message));
297
+ process.exit(1);
298
+ }
299
+ });
300
+ }
301
+
302
+ function setupEvidenceKindGetCommand(cmd) {
303
+ cmd
304
+ .command('get <evidenceKindIdOrKey>')
305
+ .description('Get evidence kind by id or key')
306
+ .addHelpText('after', EVIDENCE_KIND_GET_HELP_AFTER)
307
+ .action(async(evidenceKindIdOrKey, options) => {
308
+ try {
309
+ const { environment, controllerUrl: headerControllerUrl } = await resolveHeaderContext();
310
+ const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
311
+ const res = await getEvidenceKind(controllerUrl, authConfig, String(evidenceKindIdOrKey).trim());
312
+ const row = unwrapControllerData(res);
313
+ logger.log(
314
+ chalk.bold(
315
+ `\n📎 Evidence kind in ${environment} environment (${headerControllerUrl}):\n`
316
+ )
317
+ );
318
+ logger.log(headerKeyValue('Key:', row.key || '—'));
319
+ logger.log(headerKeyValue('Display:', row.displayName || '—'));
320
+ logger.log(headerKeyValue('Domain:', row.domainKey || '—'));
321
+ logger.log(headerKeyValue('Purpose:', row.purpose || '—'));
322
+ logger.log(headerKeyValue('Severity:', row.defaultSeverity || '—'));
323
+ logger.log(headerKeyValue('Active:', row.isActive === false ? 'false' : 'true'));
324
+ if (row.expectedUse) logger.log(headerKeyValue('Expected use:', row.expectedUse));
325
+ if (row.description) logger.log(headerKeyValue('Description:', row.description));
326
+ logger.log('');
327
+ } catch (e) {
328
+ logger.error(formatBlockingError(e.message));
329
+ process.exit(1);
330
+ }
331
+ });
332
+ }
333
+
334
+ const EVIDENCE_KIND_LIST_COLUMNS = { key: 24, display: 24, domain: 14, severity: 10, active: 8 };
335
+
336
+ function logEvidenceKindListHeader(columns) {
337
+ const keyCol = 'Key'.padEnd(columns.key);
338
+ const displayCol = 'Display'.padEnd(columns.display);
339
+ const domainCol = 'Domain'.padEnd(columns.domain);
340
+ const severityCol = 'Severity'.padEnd(columns.severity);
341
+ const activeCol = 'Active'.padEnd(columns.active);
342
+ logger.log(chalk.gray(`${keyCol}${displayCol}${domainCol}${severityCol}${activeCol}`));
343
+ logger.log(
344
+ chalk.gray(
345
+ '-'.repeat(
346
+ columns.key + columns.display + columns.domain + columns.severity + columns.active
347
+ )
348
+ )
349
+ );
350
+ }
351
+
352
+ function logEvidenceKindListRows(items, columns) {
353
+ items.forEach((d) => {
354
+ const key = (d?.key ?? '—').toString().padEnd(columns.key);
355
+ const displayName = (d?.displayName ?? '—').toString().padEnd(columns.display);
356
+ const domain = (d?.domainKey ?? '—').toString().padEnd(columns.domain);
357
+ const severity = (d?.defaultSeverity ?? '—').toString().padEnd(columns.severity);
358
+ const active = (d?.isActive === false ? 'false' : 'true').padEnd(columns.active);
359
+ logger.log(`${key}${displayName}${domain}${severity}${active}`);
360
+ });
361
+ }
362
+
363
+ function displayEvidenceKindList(items, environment, controllerUrl) {
364
+ logger.log(
365
+ chalk.bold(`\n📎 Evidence kinds in ${environment} environment (${controllerUrl}):\n`)
366
+ );
367
+ if (!Array.isArray(items) || items.length === 0) {
368
+ logger.log(chalk.gray(' No evidence kinds found.\n'));
369
+ return;
370
+ }
371
+ logEvidenceKindListHeader(EVIDENCE_KIND_LIST_COLUMNS);
372
+ logEvidenceKindListRows(items, EVIDENCE_KIND_LIST_COLUMNS);
373
+ logger.log('');
374
+ }
375
+
376
+ function setupEvidenceKindListCommand(cmd) {
377
+ cmd
378
+ .command('list')
379
+ .description('List evidence kinds')
380
+ .addHelpText('after', EVIDENCE_KIND_LIST_HELP_AFTER)
381
+ .option('--page <n>', 'Page', (v) => parseInt(v, 10))
382
+ .option('--page-size <n>', 'Page size', (v) => parseInt(v, 10))
383
+ .option('--search <text>', 'Search by key/displayName/description')
384
+ .option('--domain-key <domain>', 'Filter by domain key')
385
+ .action(async(options) => {
386
+ try {
387
+ const { environment, controllerUrl: headerControllerUrl } = await resolveHeaderContext();
388
+ const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
389
+ const res = await listEvidenceKinds(controllerUrl, authConfig, {
390
+ page: options.page,
391
+ pageSize: options.pageSize,
392
+ search: options.search,
393
+ domainKey: options.domainKey
394
+ });
395
+ const payload = unwrapControllerData(res);
396
+ const items = payload?.data ?? payload ?? [];
397
+ displayEvidenceKindList(items, environment, headerControllerUrl);
398
+ } catch (e) {
399
+ logger.error(formatBlockingError(e.message));
400
+ process.exit(1);
401
+ }
402
+ });
403
+ }
404
+
405
+ /**
406
+ * @param {import('commander').Command} program
407
+ */
408
+ function setupEvidenceKindCommands(program) {
409
+ const cmd = program
410
+ .command('evidence-kind')
411
+ .description('Manage the Controller Evidence Kind Catalog')
412
+ .addHelpText('after', EVIDENCE_KIND_HELP_AFTER);
413
+ setupEvidenceKindCreateCommand(cmd);
414
+ setupEvidenceKindImportCommand(cmd);
415
+ setupEvidenceKindExportCommand(cmd);
416
+ setupEvidenceKindGetCommand(cmd);
417
+ setupEvidenceKindListCommand(cmd);
418
+ }
419
+
420
+ module.exports = {
421
+ setupEvidenceKindCommands,
422
+ requireEvidenceKindKey,
423
+ buildCreatePayload,
424
+ unwrapControllerData,
425
+ importEvidenceKindRows,
426
+ mapEvidenceKindFileToApiPayload,
427
+ mapEvidenceKindApiToFileRow
428
+ };
@@ -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;
@@ -14,6 +14,7 @@ const { displayVerifyGovernanceTTY } = require('../lifecycle/report-display');
14
14
  const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
15
15
  const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
16
16
  const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
17
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
17
18
 
18
19
  /**
19
20
  * Commander repeatable-option collector. Splits comma-separated values so both
@@ -31,11 +32,12 @@ function collectString(value, previous) {
31
32
  }
32
33
 
33
34
  function normalizeGovernanceOptions(options, cmd) {
34
- const parent = cmd && cmd.parent ? cmd.parent.opts() : {};
35
+ const parentCmd = cmd && cmd.parent ? cmd.parent : null;
36
+ const parent = parentCmd ? parentCmd.opts() : {};
35
37
  return {
36
38
  env: options.env || parent.env || 'dev',
37
39
  verbose: options.verbose === true || parent.verbose === true,
38
- noSync: options.noSync === true || parent.noSync === true,
40
+ noPublish: cliOptsSkipPublish(options, cmd) || cliOptsSkipPublish(parent, parentCmd),
39
41
  force: options.force === true || parent.force === true,
40
42
  json: options.json === true || parent.json === true,
41
43
  pack: options.pack,
@@ -109,7 +111,7 @@ async function governanceUploadHandler(systemKey, options, cmd) {
109
111
  async function governanceDownloadHandler(systemKey, options, cmd) {
110
112
  try {
111
113
  const opts = normalizeGovernanceOptions(options, cmd);
112
- opts.noSync = true;
114
+ opts.noPublish = true;
113
115
  const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
114
116
  if (opts.json) {
115
117
  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
+ };
@@ -21,7 +21,7 @@ const {
21
21
 
22
22
  const SHARED_OPTS = [
23
23
  ['-e, --env <env>', 'Environment: dev, tst, or pro', 'dev'],
24
- ['--no-sync', 'Skip publishing local integration files before dataplane calls'],
24
+ ['--no-publish', 'Skip publishing local integration files before dataplane calls'],
25
25
  [
26
26
  '--force',
27
27
  'With default sync, pass force to upload (same as aifabrix upload --force)'
@@ -8,7 +8,7 @@
8
8
 
9
9
  const logger = require('../utils/logger');
10
10
  const { handleCommandError } = require('../utils/cli-utils');
11
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
11
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
12
12
  const { runLifecycleForExternalSystem } = require('./lifecycle-external');
13
13
  const { displayLifecycleReportTTY } = require('../lifecycle/report-display');
14
14
  const { VERDICT } = require('../lifecycle/product-model');
@@ -29,7 +29,7 @@ function normalizeLifecycleCliOptions(options, cmd) {
29
29
  debug: options.debug === true || has('-d') || has('--debug'),
30
30
  json: options.json === true || has('--json'),
31
31
  run: options.run === true || has('--run'),
32
- noSync: cliOptsSkipSync(options, cmd),
32
+ noPublish: cliOptsSkipPublish(options, cmd),
33
33
  force: options.force === true || has('--force'),
34
34
  subjectUserId: options.subjectUserId || [],
35
35
  subjectEmail: options.subjectEmail || [],
@@ -9,7 +9,7 @@
9
9
  const { getSystemLifecycleReport, runSystemLifecycle } = require('../api/lifecycle.api');
10
10
  const { setupIntegrationTestAuth } = require('../external-system/test-auth');
11
11
  const { getConfig } = require('../core/config');
12
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
12
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
13
13
  const { syncLocalIfRequested } = require('./test-e2e-external');
14
14
  const { runVerifyOperationsForExternalSystem } = require('./verify-operations-external');
15
15
  const { runVerifyTrustForExternalSystem } = require('./verify-trust-external');
@@ -45,7 +45,7 @@ async function resolveLifecycleDataplaneUiBaseUrl(dataplaneUrl) {
45
45
  * @returns {Promise<{ authConfig: Object, dataplaneUrl: string }>}
46
46
  */
47
47
  async function resolveLifecycleAuth(systemKey, options) {
48
- if (!cliOptsSkipSync(options) && options.run === true) {
48
+ if (!cliOptsSkipPublish(options) && options.run === true) {
49
49
  options.lifecycleProgress?.setLabel?.('Checking config on dataplane');
50
50
  const uploadCtx = await syncLocalIfRequested(systemKey, {
51
51
  ...options,
@@ -97,7 +97,7 @@ async function runLifecycleGovernanceCombinedIfNeeded(
97
97
  * @param {Object} options
98
98
  */
99
99
  async function runMissingVerifyStepsLocally(systemKey, report, options) {
100
- const runOpts = { ...options, noSync: true };
100
+ const runOpts = { ...options, noPublish: true };
101
101
  if (report.operations?.verdict !== VERDICT.VERIFIED) {
102
102
  await runVerifyOperationsForExternalSystem(systemKey, runOpts);
103
103
  }