@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,160 @@
1
+ /**
2
+ * Single external system/datasource file validation.
3
+ *
4
+ * @fileoverview Extracted from validate.js (max-lines split)
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const yaml = require('js-yaml');
13
+ const { loadExternalSystemSchema, loadExternalDataSourceSchema } = require('../utils/schema-loader');
14
+ const { formatValidationErrors } = require('../utils/error-formatter');
15
+ const { validateFieldReferences } = require('../datasource/field-reference-validator');
16
+ const { validateAbac } = require('../datasource/abac-validator');
17
+ const {
18
+ validateOAuth2GrantTypeAndAuthorizationUrl,
19
+ validateConfigurationNoStandardAuthVariables
20
+ } = require('./external-system-auth-rules');
21
+
22
+ /**
23
+ * Parses external system/datasource file content (JSON or YAML).
24
+ * @param {string} filePath - File path (.json, .yaml, or .yml)
25
+ * @returns {Object} Parse result with parsed object or error
26
+ */
27
+ function parseJsonFileContent(filePath) {
28
+ const content = fs.readFileSync(filePath, 'utf8');
29
+ const isYaml = /\.(yaml|yml)$/i.test(filePath);
30
+ try {
31
+ const parsed = isYaml ? yaml.load(content) : JSON.parse(content);
32
+ return { parsed: parsed || {}, error: null };
33
+ } catch (error) {
34
+ return {
35
+ parsed: null,
36
+ error: {
37
+ valid: false,
38
+ errors: [isYaml ? `Invalid YAML syntax: ${error.message}` : `Invalid JSON syntax: ${error.message}`],
39
+ warnings: []
40
+ }
41
+ };
42
+ }
43
+ }
44
+
45
+ /**
46
+ * @param {string} normalizedType
47
+ * @returns {Function}
48
+ */
49
+ function getValidatorForType(normalizedType) {
50
+ if (normalizedType === 'system') {
51
+ return loadExternalSystemSchema();
52
+ }
53
+ if (normalizedType === 'datasource') {
54
+ return loadExternalDataSourceSchema();
55
+ }
56
+ throw new Error(`Unknown file type: ${normalizedType}`);
57
+ }
58
+
59
+ /**
60
+ * @param {Object} parsed
61
+ * @param {string[]} errors
62
+ */
63
+ function validateRoleReferences(parsed, errors) {
64
+ if (!parsed.permissions || !Array.isArray(parsed.permissions)) {
65
+ return;
66
+ }
67
+
68
+ const roles = parsed.roles || [];
69
+ const roleValues = new Set(roles.map((r) => r.value));
70
+
71
+ parsed.permissions.forEach((permission, index) => {
72
+ if (permission.roles && Array.isArray(permission.roles)) {
73
+ permission.roles.forEach((roleValue) => {
74
+ if (!roleValues.has(roleValue)) {
75
+ errors.push(
76
+ `Permission "${permission.name}" (index ${index}) references role "${roleValue}" which does not exist in roles array`
77
+ );
78
+ }
79
+ });
80
+ }
81
+ });
82
+ }
83
+
84
+ /**
85
+ * @param {Object} parsed
86
+ * @param {string[]} errors
87
+ */
88
+ function validateSystemFileExtras(parsed, errors) {
89
+ validateRoleReferences(parsed, errors);
90
+ validateOAuth2GrantTypeAndAuthorizationUrl(parsed, errors);
91
+ validateConfigurationNoStandardAuthVariables(parsed, errors);
92
+ }
93
+
94
+ /**
95
+ * @param {Object} parsed
96
+ * @param {string} filePath
97
+ * @returns {{ errors: string[], warnings: string[] }}
98
+ */
99
+ function validateDatasourceFileExtras(parsed, filePath) {
100
+ const { collectExternalDatasourceWarnings } = require('./datasource-warnings');
101
+ const { validateDatasourceFileContractSurface } = require('./openapi-contract-surface-validator');
102
+ const errors = [...validateFieldReferences(parsed), ...validateAbac(parsed)];
103
+ const contractSurface = validateDatasourceFileContractSurface(parsed, filePath);
104
+ errors.push(...contractSurface.errors);
105
+ const warnings = [
106
+ ...collectExternalDatasourceWarnings(parsed),
107
+ ...contractSurface.warnings
108
+ ];
109
+ return { errors, warnings };
110
+ }
111
+
112
+ /**
113
+ * @async
114
+ * @param {string} filePath
115
+ * @param {string} type
116
+ * @returns {Promise<Object>}
117
+ */
118
+ async function validateExternalFile(filePath, type) {
119
+ if (!fs.existsSync(filePath)) {
120
+ throw new Error(`File not found: ${filePath}`);
121
+ }
122
+
123
+ const parseResult = parseJsonFileContent(filePath);
124
+ if (parseResult.error) {
125
+ return parseResult.error;
126
+ }
127
+
128
+ const normalizedType =
129
+ type === 'external-system' ? 'system' : (type === 'external-datasource' ? 'datasource' : type);
130
+ const validate = getValidatorForType(normalizedType);
131
+ const valid = validate(parseResult.parsed);
132
+
133
+ const errors = valid ? [] : formatValidationErrors(validate.errors);
134
+ const warnings = [];
135
+
136
+ if (normalizedType === 'system') {
137
+ validateSystemFileExtras(parseResult.parsed, errors);
138
+ }
139
+
140
+ if (normalizedType === 'datasource') {
141
+ const dsResult = validateDatasourceFileExtras(parseResult.parsed, filePath);
142
+ errors.push(...dsResult.errors);
143
+ warnings.push(...dsResult.warnings);
144
+ }
145
+
146
+ return {
147
+ valid: errors.length === 0,
148
+ errors,
149
+ warnings,
150
+ file: filePath,
151
+ type: type
152
+ };
153
+ }
154
+
155
+ module.exports = {
156
+ parseJsonFileContent,
157
+ getValidatorForType,
158
+ validateRoleReferences,
159
+ validateExternalFile
160
+ };
@@ -10,13 +10,9 @@
10
10
  */
11
11
 
12
12
  const fs = require('fs');
13
- const yaml = require('js-yaml');
14
13
  const validator = require('./validator');
15
14
  const { resolveExternalFiles } = require('../utils/schema-resolver');
16
- const { loadExternalSystemSchema, loadExternalDataSourceSchema, detectSchemaType } = require('../utils/schema-loader');
17
- const { formatValidationErrors } = require('../utils/error-formatter');
18
- const { validateFieldReferences } = require('../datasource/field-reference-validator');
19
- const { validateAbac } = require('../datasource/abac-validator');
15
+ const { detectSchemaType } = require('../utils/schema-loader');
20
16
  const { detectAppType } = require('../utils/paths');
21
17
  const batch = require('./validate-batch');
22
18
  const { logOfflinePathWhenType } = require('../utils/cli-utils');
@@ -24,11 +20,8 @@ const { resolveApplicationConfigPath } = require('../utils/app-config-resolver')
24
20
  const { displayValidationResults, displayBatchValidationResults } = require('./validate-display');
25
21
  const { generateControllerManifest } = require('../generator/external-controller-manifest');
26
22
  const { validateControllerManifest } = require('./external-manifest-validator');
27
- const {
28
- validateOAuth2GrantTypeAndAuthorizationUrl,
29
- validateConfigurationNoStandardAuthVariables
30
- } = require('./external-system-auth-rules');
31
23
  const { runExternalValidateWithOptionalCertSync } = require('./validate-external-cert-sync');
24
+ const { validateExternalFile } = require('./validate-external-file');
32
25
 
33
26
  /**
34
27
  * Validates a file path (detects type and validates)
@@ -106,112 +99,7 @@ function aggregateValidationResults(appValidation, externalValidations, rbacVali
106
99
  }
107
100
 
108
101
  /**
109
- * Parses external system/datasource file content (JSON or YAML).
110
- * @function parseJsonFileContent
111
- * @param {string} filePath - File path (.json, .yaml, or .yml)
112
- * @returns {Object} Parse result with parsed object or error
113
- */
114
- function parseJsonFileContent(filePath) {
115
- const content = fs.readFileSync(filePath, 'utf8');
116
- const isYaml = /\.(yaml|yml)$/i.test(filePath);
117
- try {
118
- const parsed = isYaml ? yaml.load(content) : JSON.parse(content);
119
- return { parsed: parsed || {}, error: null };
120
- } catch (error) {
121
- return {
122
- parsed: null,
123
- error: {
124
- valid: false,
125
- errors: [isYaml ? `Invalid YAML syntax: ${error.message}` : `Invalid JSON syntax: ${error.message}`],
126
- warnings: []
127
- }
128
- };
129
- }
130
- }
131
-
132
- /**
133
- * Gets validator function for file type
134
- * @function getValidatorForType
135
- * @param {string} normalizedType - Normalized file type
136
- * @returns {Function} Validator function
137
- * @throws {Error} If type is unknown
138
- */
139
- function getValidatorForType(normalizedType) {
140
- if (normalizedType === 'system') {
141
- return loadExternalSystemSchema();
142
- }
143
- if (normalizedType === 'datasource') {
144
- return loadExternalDataSourceSchema();
145
- }
146
- throw new Error(`Unknown file type: ${normalizedType}`);
147
- }
148
-
149
- /**
150
- * Validates role references in permissions
151
- * @function validateRoleReferences
152
- * @param {Object} parsed - Parsed JSON object
153
- * @param {string[]} errors - Errors array to append to
154
- */
155
- function validateRoleReferences(parsed, errors) {
156
- if (!parsed.permissions || !Array.isArray(parsed.permissions)) {
157
- return;
158
- }
159
-
160
- const roles = parsed.roles || [];
161
- const roleValues = new Set(roles.map(r => r.value));
162
-
163
- parsed.permissions.forEach((permission, index) => {
164
- if (permission.roles && Array.isArray(permission.roles)) {
165
- permission.roles.forEach(roleValue => {
166
- if (!roleValues.has(roleValue)) {
167
- errors.push(`Permission "${permission.name}" (index ${index}) references role "${roleValue}" which does not exist in roles array`);
168
- }
169
- });
170
- }
171
- });
172
- }
173
-
174
- /** @async */
175
- async function validateExternalFile(filePath, type) {
176
- if (!fs.existsSync(filePath)) {
177
- throw new Error(`File not found: ${filePath}`);
178
- }
179
-
180
- const parseResult = parseJsonFileContent(filePath);
181
- if (parseResult.error) {
182
- return parseResult.error;
183
- }
184
-
185
- const normalizedType = type === 'external-system' ? 'system' : (type === 'external-datasource' ? 'datasource' : type);
186
- const validate = getValidatorForType(normalizedType);
187
- const valid = validate(parseResult.parsed);
188
-
189
- const errors = valid ? [] : formatValidationErrors(validate.errors);
190
- const warnings = [];
191
-
192
- if (normalizedType === 'system') {
193
- validateRoleReferences(parseResult.parsed, errors);
194
- validateOAuth2GrantTypeAndAuthorizationUrl(parseResult.parsed, errors);
195
- validateConfigurationNoStandardAuthVariables(parseResult.parsed, errors);
196
- }
197
-
198
- if (normalizedType === 'datasource') {
199
- const { collectExternalDatasourceWarnings } = require('./datasource-warnings');
200
- errors.push(...validateFieldReferences(parseResult.parsed), ...validateAbac(parseResult.parsed));
201
- warnings.push(...collectExternalDatasourceWarnings(parseResult.parsed));
202
- }
203
-
204
- return {
205
- valid: errors.length === 0,
206
- errors,
207
- warnings,
208
- file: filePath,
209
- type: type
210
- };
211
- }
212
-
213
- /**
214
- * Validates application or external integration file
102
+ * Validates a file path (detects type and validates)
215
103
  * Detects if input is app name or file path and validates accordingly
216
104
  *
217
105
  * @async
@@ -371,8 +259,9 @@ async function validateComponentsStep(appName, options = {}) {
371
259
  */
372
260
  async function validateManifestStep(appName, options = {}) {
373
261
  try {
262
+ const appPath = options.appPath || (await detectAppType(appName, options)).appPath;
374
263
  const manifest = await generateControllerManifest(appName, options);
375
- const manifestValidation = await validateControllerManifest(manifest);
264
+ const manifestValidation = await validateControllerManifest(manifest, { appPath });
376
265
  return {
377
266
  valid: manifestValidation.valid,
378
267
  errors: manifestValidation.errors || [],
@@ -434,7 +323,7 @@ async function validateExternalSystemComplete(appName, options = {}) {
434
323
  }
435
324
 
436
325
  // Step 3 & 4: Generate and Validate Full Manifest (only if Step 2 passes)
437
- steps.manifest = await validateManifestStep(appName, externalOptions);
326
+ steps.manifest = await validateManifestStep(appName, { ...externalOptions, appPath });
438
327
 
439
328
  // Aggregate Results
440
329
  const allErrors = [...steps.application.errors, ...steps.components.errors, ...steps.manifest.errors];
@@ -223,10 +223,11 @@ async function validateRbac(appName, options = {}) {
223
223
  throw new Error(`Invalid syntax in ${basename}: ${error.message}`);
224
224
  }
225
225
 
226
- const errors = [
227
- ...validateRoles(rbac.roles),
228
- ...validatePermissions(rbac.permissions)
229
- ];
226
+ const [roleErrors, permissionErrors] = await Promise.all([
227
+ Promise.resolve(validateRoles(rbac.roles)),
228
+ Promise.resolve(validatePermissions(rbac.permissions))
229
+ ]);
230
+ const errors = [...roleErrors, ...permissionErrors];
230
231
 
231
232
  return {
232
233
  valid: errors.length === 0,
@@ -275,7 +276,7 @@ async function validateEnvTemplate(appName, options = {}) {
275
276
  if (!trimmed.includes('=')) {
276
277
  errors.push(`Line ${index + 1}: Invalid environment variable format (missing =)`);
277
278
  } else {
278
- const [key, _value] = trimmed.split('=', 2);
279
+ const [key] = trimmed.split('=', 2);
279
280
  // Trim key to handle whitespace issues
280
281
  // Empty values are allowed (_value can be empty string or undefined)
281
282
  const trimmedKey = key ? key.trim() : '';
package/package.json CHANGED
@@ -1,46 +1,55 @@
1
1
  {
2
2
  "name": "@aifabrix/builder",
3
- "version": "2.49.2",
4
- "description": "AI Fabrix Local Fabric & Deployment SDK",
3
+ "version": "2.51.0",
4
+ "description": "AI Fabrix Builder — CLI and developer scripts (pnpm + af)",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
7
7
  "aifabrix": "bin/aifabrix.js",
8
8
  "af": "bin/aifabrix.js"
9
9
  },
10
10
  "scripts": {
11
- "all": "npm run precommit && npm run test:manual && npm run test:integration:fixtures && npm run test:hubspot-wizard",
12
- "test": "node tests/scripts/test-wrapper.js",
13
- "test:ci": "bash tests/scripts/ci-simulate.sh",
14
- "test:same-as-github": "npm run build:ci",
15
- "test:coverage": "cross-env RUN_COVERAGE=1 node tests/scripts/test-wrapper.js",
16
- "test:coverage:nyc": "nyc --reporter=text --reporter=lcov --reporter=html jest --config jest.config.coverage.js --runInBand",
17
- "test:watch": "jest --watch",
18
- "test:integration": "jest --config jest.config.integration.js --runInBand",
19
- "test:integration:fixtures": "jest --config jest.config.integration.fixtures.js --runInBand",
20
- "test:integration:python": "cross-env TEST_LANGUAGE=python jest --config jest.config.integration.js --runInBand",
21
- "test:integration:typescript": "cross-env TEST_LANGUAGE=typescript jest --config jest.config.integration.js --runInBand",
22
- "test:hubspot-wizard": "node integration/hubspot-test/test.js",
23
- "test:hubspot-wizard:negative": "node integration/hubspot-test/test.js --type negative",
24
- "test:hubspot-wizard:positive": "node integration/hubspot-test/test.js --type positive",
25
- "test:hubspot-dataplane-down": "node integration/hubspot-test/test-dataplane-down.js",
26
- "test:manual": "jest --config jest.config.manual.js --runInBand",
11
+ "help": "node scripts/pnpm/help.mjs",
12
+ "dev-install": "node scripts/pnpm/dev-install.mjs",
13
+ "dev": "node bin/builder-api-spike.js",
14
+ "dev-reload": "node scripts/pnpm/dev-reload.mjs",
15
+ "dev-build": "node scripts/pnpm/af.mjs dev-build",
16
+ "dev-promote": "node scripts/pnpm/af.mjs dev-promote",
17
+ "af": "node scripts/pnpm/af.mjs",
18
+ "check-quiet": "node scripts/pnpm/check-quiet.mjs",
19
+ "check": "npm run lint && npm run test",
27
20
  "lint": "eslint . --ext .js",
28
21
  "lint:fix": "eslint . --ext .js --fix",
29
- "lint:ci": "eslint . --ext .js --format json --output-file eslint-report.json",
30
- "dev": "node bin/aifabrix.js",
22
+ "test": "node tests/scripts/test-wrapper.js",
31
23
  "build": "npm run lint && npm run test",
32
24
  "build:ci": "npm run lint && npm run check:schema-sync && npm run check:flags && npm run test:ci",
33
- "pack": "npm run build && npm pack",
34
- "validate": "npm run build",
35
- "prepublishOnly": "npm run validate",
36
- "precommit": "npm run lint:fix && npm run test",
25
+ "test:ci": "bash tests/scripts/ci-simulate.sh",
37
26
  "install:local": "node scripts/install-local.js && which aifabrix && which af",
38
27
  "uninstall:local": "node scripts/install-local.js uninstall && which aifabrix && which af",
28
+ "sync-json": "node scripts/sync-builder-api-template.js",
29
+ "builder-api:build": "tsc -p packages/builder-api/tsconfig.json",
30
+ "builder-api:nest": "node bin/builder-api-nest.js",
31
+ "builder-api:cleanup": "node bin/builder-api-cleanup.js",
32
+ "check:builder-api-arch": "node scripts/check-builder-api-architecture-grep.js",
33
+ "check:schema-sync": "node scripts/check-datasource-test-run-schema-sync.js",
34
+ "check:flags": "jest tests/lib/schema/flag-map-validation-run.test.js --runInBand --config jest.config.default.js",
35
+ "test:154": "npm run check:builder-api-arch && jest --runInBand tests/lib/programmatic/ tests/packages/builder-api/ tests/lib/commands/up-builder-api.test.js tests/lib/commands/up-common.test.js tests/lib/commands/repair-deploy-script.test.js tests/lib/generator/deploy-script.test.js tests/lib/generator/wizard-generator.test.js tests/lib/scripts/sync-builder-api-template.test.js tests/lib/platform-integrations-manifest.test.js",
36
+ "test:154-docker-ip": "jest --runInBand tests/scripts/stage_builder_api_for_docker.test.js tests/scripts/docker_image_content_gate.test.js",
37
+ "stage-builder-api-docker": "node scripts/stage_builder_api_for_docker.js",
38
+ "docker-image-build-builder-api": "npm run stage-builder-api-docker && docker build -f builder/builder-api/Dockerfile -t builder-api:gate .",
39
+ "docker-image-gate-builder-api": "npm run docker-image-build-builder-api && node scripts/docker_image_content_gate.js builder-api:gate builder-api",
40
+ "test:manual": "jest --config jest.config.manual.js --runInBand",
41
+ "test:integration": "jest --config jest.config.integration.js --runInBand",
42
+ "test:integration:fixtures": "jest --config jest.config.integration.fixtures.js --runInBand",
43
+ "test:hubspot-wizard": "node integration/hubspot-test/test.js",
44
+ "test:hubspot-dataplane-down": "node integration/hubspot-test/test-dataplane-down.js",
45
+ "test:coverage": "cross-env RUN_COVERAGE=1 node tests/scripts/test-wrapper.js",
46
+ "test:watch": "jest --watch",
47
+ "diagnose:cli": "node scripts/diagnose-cli.js",
39
48
  "install:global": "npm install -g . --force && which aifabrix && which af && aifabrix --version",
40
49
  "uninstall:global": "npm uninstall -g @aifabrix/builder",
41
- "diagnose:cli": "node scripts/diagnose-cli.js",
42
- "check:schema-sync": "node scripts/check-datasource-test-run-schema-sync.js",
43
- "check:flags": "jest tests/lib/schema/flag-map-validation-run.test.js --runInBand --config jest.config.default.js"
50
+ "pack": "npm run build && npm pack",
51
+ "validate": "npm run build",
52
+ "prepublishOnly": "npm run validate"
44
53
  },
45
54
  "keywords": [
46
55
  "aifabrix",
@@ -76,34 +85,64 @@
76
85
  "cache": true,
77
86
  "temp-dir": ".nyc_output"
78
87
  },
88
+ "overrides": {
89
+ "@babel/core": "^7.29.7",
90
+ "@babel/plugin-transform-modules-systemjs": "^7.29.7",
91
+ "fast-uri": "^4.1.0",
92
+ "flatted": "^3.4.2",
93
+ "follow-redirects": "^1.16.0",
94
+ "form-data": "^4.0.6",
95
+ "lodash": "^4.18.1",
96
+ "minimatch": "^10.2.5",
97
+ "picomatch": "^4.0.5",
98
+ "qs": "^6.15.3"
99
+ },
79
100
  "pnpm": {
80
101
  "overrides": {
81
- "@bcoe/v8-coverage": "^1.0.2"
102
+ "@bcoe/v8-coverage": "^1.0.2",
103
+ "@babel/core": "^7.29.7",
104
+ "@babel/plugin-transform-modules-systemjs": "^7.29.7",
105
+ "fast-uri": "^4.1.0",
106
+ "flatted": "^3.4.2",
107
+ "follow-redirects": "^1.16.0",
108
+ "form-data": "^4.0.6",
109
+ "lodash": "^4.18.1",
110
+ "minimatch": "^10.2.5",
111
+ "picomatch": "^4.0.5",
112
+ "qs": "^6.15.3"
82
113
  }
83
114
  },
84
115
  "dependencies": {
85
- "ajv": "^8.12.0",
116
+ "@aifabrix/miso-client": "^4.19.0",
117
+ "ajv": "^8.20.0",
86
118
  "ajv-formats": "^3.0.1",
87
- "axios": "^1.6.0",
119
+ "axios": "^1.18.1",
88
120
  "chalk": "^4.1.2",
89
121
  "commander": "^11.1.0",
90
- "handlebars": "^4.7.8",
122
+ "handlebars": "^4.7.9",
91
123
  "inquirer": "^8.2.5",
92
124
  "inquirer-autocomplete-prompt": "^2.0.0",
93
- "js-yaml": "^4.1.0",
125
+ "js-yaml": "^4.3.0",
94
126
  "ora": "^5.4.1",
95
- "yaml": "^2.4.0"
127
+ "yaml": "^2.9.0"
96
128
  },
97
129
  "devDependencies": {
98
130
  "@babel/plugin-syntax-optional-chaining": "^7.8.3",
99
- "@babel/preset-env": "^7.29.0",
131
+ "@babel/preset-env": "^7.29.7",
100
132
  "@bcoe/v8-coverage": "^1.0.2",
133
+ "@nestjs/common": "^11.1.28",
134
+ "@nestjs/core": "^11.1.28",
135
+ "@nestjs/platform-express": "^11.1.28",
101
136
  "@types/node": "^20.10.0",
102
137
  "cross-env": "^10.1.0",
103
138
  "eslint": "^8.55.0",
104
- "jest": "^30.2.0",
105
- "markdownlint-cli": "^0.47.0",
106
- "nyc": "^17.1.0"
139
+ "jest": "^30.4.2",
140
+ "markdownlint-cli": "^0.49.0",
141
+ "nyc": "^18.0.0",
142
+ "reflect-metadata": "^0.2.2",
143
+ "rxjs": "^7.8.1",
144
+ "ts-node": "^10.9.2",
145
+ "typescript": "^5.7.2"
107
146
  },
108
147
  "repository": {
109
148
  "type": "git",
@@ -0,0 +1,120 @@
1
+ # @aifabrix/builder-api (154.0)
2
+
3
+ HTTP orchestration layer for external-system workspace lifecycle. V1 uses the shared
4
+ `lib/programmatic/` adapter over existing Builder CLI libraries (no duplicate facades).
5
+
6
+ ## Run with Builder CLI (recommended)
7
+
8
+ From the **aifabrix-builder** repository root:
9
+
10
+ ```bash
11
+ # From aifabrix-builder repo root
12
+ aifabrix auth status
13
+ aifabrix up-platform # full stack (includes builder-api)
14
+ # or incremental when miso + dataplane already run:
15
+ aifabrix up-builder-api
16
+ aifabrix resolve builder-api # refresh .env from env.template
17
+ aifabrix run builder-api --reload
18
+ ```
19
+
20
+ Hot reload (bind-mount repo root, same pattern as dataplane / miso-controller):
21
+
22
+ ```bash
23
+ pnpm run dev-reload
24
+ # or: aifabrix run builder-api --reload
25
+ ```
26
+
27
+ Logs, stop, and lifecycle match other Builder-managed apps:
28
+
29
+ ```bash
30
+ aifabrix logs builder-api
31
+ aifabrix down-app builder-api
32
+ ```
33
+
34
+ Health (adjust port for your `developer-id`): `GET http://localhost:3105/api/v1/builder/health` (dev 1 → `3005 + 100`).
35
+
36
+ ReDoc (same as dataplane / miso-controller): `GET http://localhost:3105/api/docs`
37
+ OpenAPI JSON: `GET /api/v1/builder/api-docs/openapi.json`
38
+
39
+ Platform integration SSOT lives under `integration/` in the builder repo. Publish Enterprise MCP anchor and repository provider integrations before workspace flows:
40
+
41
+ ```bash
42
+ aifabrix upload enterprise-integration-lifecycle --probe
43
+ aifabrix upload <repository-provider-systemKey> --probe
44
+ pnpm run dev-reload # builder-api container
45
+ ```
46
+
47
+ See `integration/README.md` in the builder repo.
48
+
49
+ ## Run on host (development / tests only)
50
+
51
+ For Jest e2e and quick iteration without Docker, resolve from `builder/builder-api/env.template` (uses `url://` tokens like miso-controller/dataplane) or set localhost URLs manually:
52
+
53
+ ```bash
54
+ aifabrix resolve builder-api # preferred — expands url://miso-controller-internal, url://dataplane-internal, url://keycloak-*
55
+
56
+ # or manual host overrides:
57
+ export WORKSPACE_ROOT=/tmp/builder-workspaces
58
+ export MISO_CLIENTID=miso-controller-dev-builder-api
59
+ export MISO_CLIENTSECRET=<from aifabrix app register builder-api>
60
+ export MISO_CONTROLLER_URL=http://localhost:3100/miso
61
+ export DATAPLANE_URL=http://localhost:3101/data
62
+ export DEFAULT_ENVIRONMENT=dev
63
+
64
+ pnpm run dev
65
+ # or Nest bootstrap: npm run builder-api:nest
66
+ ```
67
+
68
+ ## Workspace cleanup
69
+
70
+ Scheduled purge of stale draft workspaces (env `WORKSPACE_DRAFT_TTL_DAYS`, `WORKSPACE_INACTIVE_MAX_DAYS`):
71
+
72
+ ```bash
73
+ npm run builder-api:cleanup
74
+ npm run builder-api:cleanup -- --dry-run
75
+ ```
76
+
77
+ In Docker, schedule via platform cron or sidecar invoking `node bin/builder-api-cleanup.js`.
78
+
79
+ ## Package layout
80
+
81
+ ```text
82
+ builder/builder-api/ # SSOT (edit here; npm run sync-json → template)
83
+ templates/applications/builder-api/ # Shipped template copy
84
+ packages/builder-api/
85
+ src/main.ts # Nest bootstrap → nest-http-bridge
86
+ src/app.module.ts
87
+ MANUAL-CHECKLIST.md
88
+ lib/programmatic/ # Shared HTTP handlers + Enterprise MCP client
89
+ ```
90
+
91
+ Compile TypeScript: `npm run builder-api:build` (output in `packages/builder-api/dist/`).
92
+
93
+ ## 154.1 routes (Enterprise MCP client)
94
+
95
+ Provider-neutral HTTP orchestration — remote repository/template via Dataplane Enterprise MCP:
96
+
97
+ - `POST /systems/{systemKey}/template/materialize`
98
+ - `GET /systems/{systemKey}/workspace/status`
99
+ - `POST /systems/{systemKey}/workspace/diff` / `workspace/reset`
100
+ - `POST /systems/{systemKey}/repository/sync` / `create-review` / `dispatch-pipeline`
101
+ - `GET /systems/{systemKey}/repository/status`
102
+
103
+ Governance gates use existing Dataplane lifecycle / verify-trust APIs (no can-execute proxy in builder-api V1).
104
+
105
+ Architecture CI: `npm run check:builder-api-arch`
106
+
107
+ All other routes require `Authorization: Bearer <token from aifabrix login>`.
108
+
109
+ See `MANUAL-CHECKLIST.md` for manual verification, `docs/external-systems.md` and `docs/wizard.md` for integration workflow context.
110
+
111
+ ## Nest migration
112
+
113
+ This package currently reuses the Node HTTP server in `lib/programmatic/builder-api-server.js`.
114
+ NestJS scaffold wraps the same `route-handlers` module via `nest-http-bridge.js`.
115
+
116
+ ## Not builder-server
117
+
118
+ This service is **not** the dev onboarding `builder-server`. It is stateless multi-user workspace
119
+ orchestration with Dataplane as governance authority. Do **not** use ad hoc `docker compose` under
120
+ `packages/builder-api/` — use `aifabrix run builder-api` for the full application lifecycle.
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@aifabrix/builder-api",
3
+ "version": "0.1.0",
4
+ "description": "AI Fabrix Builder API — HTTP orchestration for external system lifecycle (plan 154.0)",
5
+ "private": true,
6
+ "main": "../../lib/programmatic/builder-api-server.js",
7
+ "bin": {
8
+ "builder-api": "../../bin/builder-api-spike.js",
9
+ "builder-api-nest": "../../bin/builder-api-nest.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc -p tsconfig.json",
13
+ "start": "node ../../bin/builder-api-spike.js",
14
+ "start:nest": "node ../../bin/builder-api-nest.js",
15
+ "cleanup": "node ../../bin/builder-api-cleanup.js"
16
+ },
17
+ "engines": {
18
+ "node": ">=18.0.0"
19
+ },
20
+ "dependencies": {
21
+ "@aifabrix/miso-client": "4.19.0"
22
+ },
23
+ "peerDependencies": {
24
+ "@nestjs/common": "^10.0.0",
25
+ "@nestjs/core": "^10.0.0",
26
+ "@nestjs/platform-express": "^10.0.0",
27
+ "reflect-metadata": "^0.2.0",
28
+ "rxjs": "^7.8.0"
29
+ }
30
+ }
@@ -0,0 +1,7 @@
1
+ import { Module } from '@nestjs/common';
2
+
3
+ /**
4
+ * Root Nest module — HTTP routing is delegated to lib/programmatic via nest-http-bridge.
5
+ */
6
+ @Module({})
7
+ export class AppModule {}
@@ -0,0 +1,5 @@
1
+ import { Module } from '@nestjs/common';
2
+
3
+ /** Placeholder for future BearerAuthGuard wiring (V1 auth runs in lib/programmatic). */
4
+ @Module({})
5
+ export class AuthModule {}