@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,5 @@
1
+ import { Module } from '@nestjs/common';
2
+
3
+ /** Placeholder for route-group modules; handlers live in lib/programmatic today. */
4
+ @Module({})
5
+ export class ExternalSystemModule {}
@@ -0,0 +1,16 @@
1
+ import 'reflect-metadata';
2
+ import { NestFactory } from '@nestjs/core';
3
+ import { AppModule } from './app.module';
4
+
5
+ async function bootstrap() {
6
+ const app = await NestFactory.create(AppModule, { bodyParser: false });
7
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
8
+ const { wireBuilderApiHttpBridge, BASE } = require('../../../lib/programmatic/nest-http-bridge');
9
+ wireBuilderApiHttpBridge(app.getHttpAdapter().getInstance());
10
+ const port = Number(process.env.PORT || 3005);
11
+ await app.listen(port);
12
+ // eslint-disable-next-line no-console
13
+ console.log(`builder-api (Nest) listening on http://localhost:${port}${BASE}/health`);
14
+ }
15
+
16
+ bootstrap();
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "target": "ES2020",
5
+ "outDir": "dist",
6
+ "rootDir": "src",
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "experimentalDecorators": true,
10
+ "emitDecoratorMetadata": true,
11
+ "skipLibCheck": true,
12
+ "declaration": false
13
+ },
14
+ "include": ["src/**/*.ts"]
15
+ }
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Architecture grep gate for builder-api (plan 154.1).
4
+ *
5
+ * Fails when provider-specific strings appear under lib/programmatic or packages/builder-api.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+
13
+ const ROOT = path.join(__dirname, '..');
14
+ const SCAN_DIRS = ['lib/programmatic', 'packages/builder-api'];
15
+ const FORBIDDEN = /\b(github|gitlab|bitbucket|octokit|azuredevops|azure devops|git clone)\b/i;
16
+ const ALLOWLIST = new Set([
17
+ path.normalize('lib/programmatic/openapi-descriptions.js'),
18
+ path.normalize('lib/programmatic/openapi-spec.js'),
19
+ path.normalize('packages/builder-api/MANUAL-CHECKLIST.md')
20
+ ]);
21
+
22
+ /**
23
+ * Recursively collect scannable files under a directory.
24
+ * @param {string} dir - Directory path to scan
25
+ * @param {string[]} files - Output file list
26
+ * @returns {void}
27
+ */
28
+ function walk(dir, files) {
29
+ if (!fs.existsSync(dir)) {
30
+ return;
31
+ }
32
+ for (const name of fs.readdirSync(dir)) {
33
+ const full = path.join(dir, name);
34
+ const stat = fs.statSync(full);
35
+ if (stat.isDirectory()) {
36
+ walk(full, files);
37
+ continue;
38
+ }
39
+ if (!/\.(js|ts|md|json|yml|yaml)$/.test(name)) {
40
+ continue;
41
+ }
42
+ files.push(full);
43
+ }
44
+ }
45
+
46
+ /** @type {string[]} */
47
+ const files = [];
48
+ for (const rel of SCAN_DIRS) {
49
+ walk(path.join(ROOT, rel), files);
50
+ }
51
+
52
+ /** @type {Array<{ file: string, line: number, text: string }>} */
53
+ const violations = [];
54
+
55
+ for (const file of files) {
56
+ const rel = path.normalize(path.relative(ROOT, file));
57
+ if (ALLOWLIST.has(rel)) {
58
+ continue;
59
+ }
60
+ const content = fs.readFileSync(file, 'utf8');
61
+ content.split('\n').forEach((line, index) => {
62
+ if (FORBIDDEN.test(line)) {
63
+ violations.push({ file: rel, line: index + 1, text: line.trim() });
64
+ }
65
+ });
66
+ }
67
+
68
+ if (violations.length > 0) {
69
+ // eslint-disable-next-line no-console
70
+ console.error('builder-api architecture grep failed:');
71
+ for (const row of violations) {
72
+ // eslint-disable-next-line no-console
73
+ console.error(` ${row.file}:${row.line}: ${row.text}`);
74
+ }
75
+ process.exit(1);
76
+ }
77
+
78
+ // eslint-disable-next-line no-console
79
+ console.log('builder-api architecture grep passed');
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fail when a built Docker image contains dev-only paths (plan 154.3).
4
+ *
5
+ * @fileoverview builder-api image content gate
6
+ * @author AI Fabrix Team
7
+ * @version 1.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ const { checkImage } = require('./lib/docker-image-content-gate-core');
13
+
14
+ /**
15
+ * @param {string[]} argv
16
+ * @returns {number}
17
+ */
18
+ function main(argv) {
19
+ const args = argv.slice(2);
20
+ if (args.length < 2) {
21
+ console.error('Usage: docker_image_content_gate.js <image> <profile>');
22
+ return 1;
23
+ }
24
+
25
+ const [image, profile] = args;
26
+ try {
27
+ const violations = checkImage(image, profile);
28
+ if (violations.length > 0) {
29
+ console.error(`Image ${image} failed ${profile} content gate:`);
30
+ for (const path of violations) {
31
+ console.error(` - forbidden: ${path}`);
32
+ }
33
+ return 1;
34
+ }
35
+ console.log(`OK: ${image} passed ${profile} content gate`);
36
+ return 0;
37
+ } catch (error) {
38
+ console.error(`ERROR: ${error.message}`);
39
+ return 1;
40
+ }
41
+ }
42
+
43
+ if (require.main === module) {
44
+ process.exit(main(process.argv));
45
+ }
46
+
47
+ module.exports = { main };
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env sh
2
+ # Plan 154.3 — verify a built builder-api image does not contain dev-only trees.
3
+ set -eu
4
+ ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)"
5
+ exec node "$ROOT/scripts/docker_image_content_gate.js" "$@"
@@ -0,0 +1,262 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Export builder-api help/knowledge fixtures to Evidence Fabrix v2 bulk-load JSON.
4
+ *
5
+ * @fileoverview One-time / repeatable generator for Role Assistant evidence import
6
+ * @author AI Fabrix Team
7
+ * @version 1.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+
15
+ const REPO_ROOT = path.join(__dirname, '..');
16
+ const DEFAULT_OUT = path.join(
17
+ REPO_ROOT,
18
+ '..',
19
+ 'aifabrix-dataplane',
20
+ 'integration',
21
+ 'builder-api',
22
+ 'builder-api-evidence.json'
23
+ );
24
+
25
+ const EVIDENCE_PATTERNS = path.join(REPO_ROOT, 'docs', 'builder-help', 'evidence-patterns.json');
26
+ const GOLDEN_DIR = path.join(REPO_ROOT, 'docs', 'builder-help', 'golden-examples');
27
+ const PLATFORM_ROLES = path.join(REPO_ROOT, 'docs', 'builder-help', 'platform-roles.json');
28
+ const RESOURCE_CATALOG = path.join(REPO_ROOT, 'docs', 'builder-help', 'resource-type-catalog.json');
29
+ const HELP_MD_DIR = path.join(REPO_ROOT, 'lib', 'programmatic', 'help-content');
30
+
31
+ /** @type {Array<{ file: string, resourceType: string, order: number }>} */
32
+ const MD_TOPICS = [
33
+ { file: 'overview.md', resourceType: 'workspace', order: 10 },
34
+ { file: 'workflow.md', resourceType: 'workspace', order: 20 },
35
+ { file: 'subscription-guide.md', resourceType: 'system', order: 30 },
36
+ { file: 'cip-overview.md', resourceType: 'task', order: 40 },
37
+ { file: 'dimensions-guide.md', resourceType: 'policy', order: 50 },
38
+ { file: 'channel-onboarding.md', resourceType: 'channel', order: 60 },
39
+ { file: 'connected-system-ui.md', resourceType: 'workspace', order: 70 }
40
+ ];
41
+
42
+ /**
43
+ * @param {string} text
44
+ * @returns {string}
45
+ */
46
+ function stripMarkdown(text) {
47
+ return String(text || '')
48
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
49
+ .replace(/https?:\/\/[^\s)]+/gi, '')
50
+ .replace(/^#+\s*/gm, '')
51
+ .replace(/\s{2,}/g, ' ')
52
+ .trim();
53
+ }
54
+
55
+ /**
56
+ * @param {string} fileName
57
+ * @returns {{ title: string, summary: string, body: string }}
58
+ */
59
+ function parseMarkdownTopic(fileName) {
60
+ const raw = fs.readFileSync(path.join(HELP_MD_DIR, fileName), 'utf8');
61
+ const lines = raw.split(/\r?\n/);
62
+ let title = path.basename(fileName, '.md');
63
+ const bodyLines = [];
64
+ for (const line of lines) {
65
+ if (line.startsWith('# ')) {
66
+ title = stripMarkdown(line.slice(2));
67
+ } else if (line.trim()) {
68
+ bodyLines.push(line);
69
+ }
70
+ }
71
+ const body = stripMarkdown(bodyLines.join('\n'));
72
+ const summary = body.slice(0, 240);
73
+ return { title, summary, body };
74
+ }
75
+
76
+ /**
77
+ * @param {Object} row
78
+ * @returns {Object}
79
+ */
80
+ function normalizeRow(row) {
81
+ const out = {
82
+ resourceType: String(row.resourceType || 'workspace').trim(),
83
+ title: String(row.title || '').trim(),
84
+ when: String(row.when || '').trim(),
85
+ expectedBehavior: String(row.expectedBehavior || '').trim(),
86
+ order: Number.isFinite(row.order) ? row.order : 100,
87
+ status: row.status === 'disabled' ? 'disabled' : 'active'
88
+ };
89
+ if (row.roleKey) {
90
+ out.roleKey = String(row.roleKey).trim();
91
+ }
92
+ if (row.description) {
93
+ out.description = String(row.description).trim();
94
+ }
95
+ return out;
96
+ }
97
+
98
+ /**
99
+ * @returns {Object[]}
100
+ */
101
+ function rowsFromEvidencePatterns() {
102
+ const doc = JSON.parse(fs.readFileSync(EVIDENCE_PATTERNS, 'utf8'));
103
+ return (doc.patterns || []).map((p, i) =>
104
+ normalizeRow({
105
+ resourceType: p.resourceType || 'document',
106
+ title: p.title,
107
+ description: [p.summary, p.role ? `Audience: ${p.role}` : null, (p.steps || []).join(' → ')].filter(Boolean).join(' '),
108
+ when: p.summary || p.title,
109
+ expectedBehavior: (p.steps || []).join(' '),
110
+ order: 100 + i
111
+ })
112
+ );
113
+ }
114
+
115
+ /**
116
+ * @returns {Object[]}
117
+ */
118
+ function rowsFromGoldenExamples() {
119
+ const rows = [];
120
+ let order = 200;
121
+ for (const file of fs.readdirSync(GOLDEN_DIR).sort()) {
122
+ if (!file.endsWith('.json')) {
123
+ continue;
124
+ }
125
+ const doc = JSON.parse(fs.readFileSync(path.join(GOLDEN_DIR, file), 'utf8'));
126
+ const traversal = (doc.metadataTraversal || []).join(', ');
127
+ rows.push(
128
+ normalizeRow({
129
+ resourceType: doc.resourceType || 'document',
130
+ title: `Golden example: ${doc.title || doc.key}`,
131
+ description: [doc.summary, doc.role ? `Audience: ${doc.role}` : null].filter(Boolean).join(' '),
132
+ when: `Designing a ${doc.resourceType || 'document'} integration similar to ${doc.key}`,
133
+ expectedBehavior: [
134
+ doc.summary,
135
+ doc.subscriptionGuidance,
136
+ traversal ? `Traverse sections: ${traversal}` : null,
137
+ (doc.recommendedSectionKeys || []).length
138
+ ? `Recommended sections: ${doc.recommendedSectionKeys.join(', ')}`
139
+ : null
140
+ ]
141
+ .filter(Boolean)
142
+ .join(' '),
143
+ order: order++
144
+ })
145
+ );
146
+ }
147
+ return rows;
148
+ }
149
+
150
+ /**
151
+ * @returns {Object[]}
152
+ */
153
+ function rowsFromMarkdownTopics() {
154
+ return MD_TOPICS.map((t) => {
155
+ const parsed = parseMarkdownTopic(t.file);
156
+ return normalizeRow({
157
+ resourceType: t.resourceType,
158
+ title: parsed.title,
159
+ description: parsed.summary,
160
+ when: `Agent needs builder-api guidance for ${parsed.title}`,
161
+ expectedBehavior: parsed.body,
162
+ order: t.order
163
+ });
164
+ });
165
+ }
166
+
167
+ /**
168
+ * @returns {Object[]}
169
+ */
170
+ function rowsFromPlatformRoles() {
171
+ const doc = JSON.parse(fs.readFileSync(PLATFORM_ROLES, 'utf8'));
172
+ const roleLines = (doc.roles || [])
173
+ .map((r) => `${r.value}: ${r.description}`)
174
+ .join(' ');
175
+ return [
176
+ normalizeRow({
177
+ resourceType: 'policy',
178
+ title: 'Platform RBAC roles for facade integrations',
179
+ description: 'Dataplane platform roles for orchestration facade systems (not per-system admin/reader).',
180
+ when: 'Patching system.rolesPermissions or repair rbac on a builder-api facade system',
181
+ expectedBehavior: `Use rbacPreset platform. Allowed roles: ${roleLines}. Avoid {systemKey}-admin or {systemKey}-reader on facade APIs.`,
182
+ order: 5
183
+ })
184
+ ];
185
+ }
186
+
187
+ /**
188
+ * @returns {Object[]}
189
+ */
190
+ function rowsFromResourceCatalog() {
191
+ const doc = JSON.parse(fs.readFileSync(RESOURCE_CATALOG, 'utf8'));
192
+ const byCategory = {};
193
+ for (const rt of doc.resourceTypes || []) {
194
+ const cat = rt.category || 'other';
195
+ if (!byCategory[cat]) {
196
+ byCategory[cat] = [];
197
+ }
198
+ byCategory[cat].push(`${rt.key} (${rt.description})`);
199
+ }
200
+ const summary = Object.entries(byCategory)
201
+ .map(([cat, items]) => `${cat}: ${items.slice(0, 8).join('; ')}`)
202
+ .join(' ');
203
+ return [
204
+ normalizeRow({
205
+ resourceType: 'document',
206
+ title: 'Resource type catalog for datasource manifests',
207
+ description: 'Pick catalog keys that match business semantics; challenge generic placeholders.',
208
+ when: 'Choosing datasource.resourceType for a new or edited datasource',
209
+ expectedBehavior: `Compare purpose to catalog entries. Minimum system keys: ${(doc.minimumSystemKeys || []).join(', ')}. Categories: ${summary}`,
210
+ order: 8
211
+ })
212
+ ];
213
+ }
214
+
215
+ /**
216
+ * @returns {Object[]}
217
+ */
218
+ function rowsFromManifestGuides() {
219
+ return [
220
+ normalizeRow({
221
+ resourceType: 'policy',
222
+ title: 'Manifest section keys and dependency order',
223
+ when: 'Agent edits external system or datasource manifest sections',
224
+ expectedBehavior:
225
+ 'Read one section at a time via manifest section APIs. After metadata or capability patches, run repair hooks for fieldMappings, expose, and rbac. Use dependency graph: downstream sections derive from upstream patches.',
226
+ order: 15
227
+ }),
228
+ normalizeRow({
229
+ resourceType: 'workspace',
230
+ title: 'Repair hooks and CLI flag mapping',
231
+ when: 'Manifest repair is required after structural edits',
232
+ expectedBehavior:
233
+ 'POST manifest repair with explicit hooks (fieldMappings, expose, rbac, sync, test). Align with repair CLI flags. Validate workspace before upload or certify.',
234
+ order: 16
235
+ }),
236
+ normalizeRow({
237
+ resourceType: 'workspace',
238
+ title: 'Section quality and missing inputs',
239
+ when: 'GET manifest section returns quality.missingInputs',
240
+ expectedBehavior:
241
+ 'Collect required missing inputs from the user before PATCH. Do not guess values. Include sectionReadToken from GET in PATCH body.',
242
+ order: 17
243
+ })
244
+ ];
245
+ }
246
+
247
+ function main() {
248
+ const outPath = path.resolve(process.argv[2] || DEFAULT_OUT);
249
+ const rows = [
250
+ ...rowsFromPlatformRoles(),
251
+ ...rowsFromResourceCatalog(),
252
+ ...rowsFromMarkdownTopics(),
253
+ ...rowsFromManifestGuides(),
254
+ ...rowsFromEvidencePatterns(),
255
+ ...rowsFromGoldenExamples()
256
+ ];
257
+ fs.mkdirSync(path.dirname(outPath), { recursive: true });
258
+ fs.writeFileSync(outPath, `${JSON.stringify(rows, null, 2)}\n`, 'utf8');
259
+ process.stdout.write(`Wrote ${rows.length} evidence row(s) to ${outPath}\n`);
260
+ }
261
+
262
+ main();
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Copy staged builder-api runtime tree to disk.
3
+ *
4
+ * @fileoverview Filesystem staging for Docker COPY layers
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+
14
+ /**
15
+ * @param {string} target
16
+ * @returns {void}
17
+ */
18
+ function removeDirIfExists(target) {
19
+ if (fs.existsSync(target)) {
20
+ fs.rmSync(target, { recursive: true, force: true });
21
+ }
22
+ }
23
+
24
+ /**
25
+ * @param {string} src
26
+ * @param {string} dest
27
+ * @returns {void}
28
+ */
29
+ function copyFileEnsureDir(src, dest) {
30
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
31
+ fs.copyFileSync(src, dest);
32
+ }
33
+
34
+ /**
35
+ * @param {string} repoRoot
36
+ * @param {string} destination
37
+ * @param {string[]} manifest
38
+ * @returns {string[]}
39
+ */
40
+ function stageFiles(repoRoot, destination, manifest) {
41
+ removeDirIfExists(destination);
42
+ fs.mkdirSync(destination, { recursive: true });
43
+
44
+ const staged = [];
45
+ for (const rel of manifest) {
46
+ const src = path.join(repoRoot, rel);
47
+ const dest = path.join(destination, rel);
48
+ if (!fs.existsSync(src)) {
49
+ continue;
50
+ }
51
+ copyFileEnsureDir(src, dest);
52
+ staged.push(rel);
53
+ }
54
+ return staged.sort();
55
+ }
56
+
57
+ module.exports = {
58
+ stageFiles,
59
+ removeDirIfExists
60
+ };
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Runtime file discovery for builder-api Docker staging (plan 154.3).
3
+ *
4
+ * @fileoverview Require-graph walk + supplemental runtime assets
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+
14
+ const REQUIRE_RE = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
15
+
16
+ /** @type {readonly string[]} */
17
+ const ENTRY_FILES = ['bin/builder-api-spike.js', 'bin/builder-api-cleanup.js'];
18
+
19
+ /** @type {readonly string[]} */
20
+ const STAGING_SKIP_FILES = ['package.json', 'package-lock.json'];
21
+
22
+ /** @type {readonly string[]} */
23
+ const SUPPLEMENTAL_DIRS = [
24
+ 'lib/schema',
25
+ 'lib/programmatic/help-content',
26
+ 'templates/openapi',
27
+ 'templates/external-system',
28
+ 'lib/datasource/capability/templates'
29
+ ];
30
+
31
+ /** @type {readonly string[]} */
32
+ const MANIFEST_FORBIDDEN_PREFIXES = [
33
+ 'templates/applications/',
34
+ 'templates/github/',
35
+ 'templates/infra/',
36
+ 'templates/python/',
37
+ 'templates/typescript/',
38
+ 'templates/channels/',
39
+ 'integration/',
40
+ 'tests/',
41
+ 'scripts/',
42
+ '.cursor/',
43
+ 'builder/',
44
+ 'packages/',
45
+ 'docs/',
46
+ 'bin/aifabrix.js',
47
+ 'lib/cli/'
48
+ ];
49
+
50
+ /**
51
+ * @param {string} repoRoot
52
+ * @param {string} fromFile
53
+ * @param {string} req
54
+ * @returns {string|null}
55
+ */
56
+ function resolveRelativeRequire(repoRoot, fromFile, req) {
57
+ if (!req.startsWith('.')) {
58
+ return null;
59
+ }
60
+ const base = path.dirname(fromFile);
61
+ let resolved = path.resolve(repoRoot, base, req);
62
+ if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {
63
+ resolved = path.join(resolved, 'index.js');
64
+ }
65
+ if (!resolved.endsWith('.js') && fs.existsSync(`${resolved}.js`)) {
66
+ resolved = `${resolved}.js`;
67
+ }
68
+ if (!fs.existsSync(resolved)) {
69
+ return null;
70
+ }
71
+ return path.relative(repoRoot, resolved).split(path.sep).join('/');
72
+ }
73
+
74
+ /**
75
+ * @param {string} repoRoot
76
+ * @param {string} relFile
77
+ * @returns {string[]}
78
+ */
79
+ function collectRequiresFromFile(repoRoot, relFile) {
80
+ const abs = path.join(repoRoot, relFile);
81
+ const content = fs.readFileSync(abs, 'utf8');
82
+ const found = [];
83
+ let match;
84
+ while ((match = REQUIRE_RE.exec(content)) !== null) {
85
+ const target = resolveRelativeRequire(repoRoot, relFile, match[1]);
86
+ if (target) {
87
+ found.push(target);
88
+ }
89
+ }
90
+ return found;
91
+ }
92
+
93
+ /**
94
+ * @param {string} dir
95
+ * @param {string} repoRoot
96
+ * @param {Set<string>} out
97
+ * @returns {void}
98
+ */
99
+ function addDirectoryFiles(dir, repoRoot, out) {
100
+ const abs = path.join(repoRoot, dir);
101
+ if (!fs.existsSync(abs)) {
102
+ return;
103
+ }
104
+ for (const entry of fs.readdirSync(abs, { withFileTypes: true })) {
105
+ const rel = path.join(dir, entry.name).split(path.sep).join('/');
106
+ if (entry.isDirectory()) {
107
+ addDirectoryFiles(rel, repoRoot, out);
108
+ continue;
109
+ }
110
+ out.add(rel);
111
+ }
112
+ }
113
+
114
+ /**
115
+ * @param {string} repoRoot
116
+ * @returns {string[]}
117
+ */
118
+ function discoverRuntimeFiles(repoRoot) {
119
+ const seen = new Set();
120
+ const queue = [...ENTRY_FILES];
121
+
122
+ while (queue.length > 0) {
123
+ const rel = queue.shift();
124
+ if (!rel || seen.has(rel)) {
125
+ continue;
126
+ }
127
+ if (!fs.existsSync(path.join(repoRoot, rel))) {
128
+ continue;
129
+ }
130
+ seen.add(rel);
131
+ for (const next of collectRequiresFromFile(repoRoot, rel)) {
132
+ if (!seen.has(next)) {
133
+ queue.push(next);
134
+ }
135
+ }
136
+ }
137
+
138
+ for (const dir of SUPPLEMENTAL_DIRS) {
139
+ addDirectoryFiles(dir, repoRoot, seen);
140
+ }
141
+
142
+ return [...seen].sort().filter((rel) => !STAGING_SKIP_FILES.includes(rel));
143
+ }
144
+
145
+ /**
146
+ * @param {string} relPath
147
+ * @returns {boolean}
148
+ */
149
+ function isForbiddenManifestPath(relPath) {
150
+ const normalized = relPath.split(path.sep).join('/');
151
+ for (const prefix of MANIFEST_FORBIDDEN_PREFIXES) {
152
+ if (normalized === prefix.replace(/\/$/, '') || normalized.startsWith(prefix)) {
153
+ return true;
154
+ }
155
+ }
156
+ if (normalized.endsWith('.md') && normalized.startsWith('lib/')) {
157
+ if (normalized.startsWith('lib/programmatic/help-content/')) {
158
+ return false;
159
+ }
160
+ return true;
161
+ }
162
+ return false;
163
+ }
164
+
165
+ /**
166
+ * @param {string[]} manifest
167
+ * @returns {string[]}
168
+ */
169
+ function findManifestViolations(manifest) {
170
+ return manifest.filter(isForbiddenManifestPath);
171
+ }
172
+
173
+ module.exports = {
174
+ ENTRY_FILES,
175
+ SUPPLEMENTAL_DIRS,
176
+ MANIFEST_FORBIDDEN_PREFIXES,
177
+ STAGING_SKIP_FILES,
178
+ discoverRuntimeFiles,
179
+ findManifestViolations,
180
+ isForbiddenManifestPath,
181
+ resolveRelativeRequire,
182
+ collectRequiresFromFile
183
+ };