@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,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
+ };