@aifabrix/builder 2.43.0 → 2.44.1

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 (371) hide show
  1. package/.cursor/rules/anchor-docs.mdc +15 -0
  2. package/.cursor/rules/cli-layout.mdc +75 -0
  3. package/.cursor/rules/project-rules.mdc +8 -0
  4. package/.npmrc.token +1 -0
  5. package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  6. package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  7. package/.nyc_output/processinfo/index.json +1 -0
  8. package/README.md +1 -1
  9. package/anchor-docs/README.md +10 -0
  10. package/anchor-docs/_TEMPLATE +24 -0
  11. package/bin/aifabrix.js +13 -4
  12. package/integration/hubspot-test/README.md +31 -0
  13. package/integration/hubspot-test/create-hubspot.js +5 -5
  14. package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
  15. package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
  16. package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
  17. package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
  18. package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
  19. package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
  20. package/integration/hubspot-test/test-dataplane-down.js +3 -3
  21. package/integration/hubspot-test/test.js +35 -43
  22. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
  23. package/integration/roundtrip-test-local/README.md +144 -0
  24. package/integration/roundtrip-test-local/application.yaml +13 -0
  25. package/integration/roundtrip-test-local/env.template +15 -0
  26. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
  27. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
  28. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
  29. package/integration/roundtrip-test-local2/README.md +144 -0
  30. package/integration/roundtrip-test-local2/application.yaml +13 -0
  31. package/integration/roundtrip-test-local2/env.template +15 -0
  32. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
  33. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
  34. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
  35. package/integration/test/wizard.yaml +8 -0
  36. package/jest.config.default.js +10 -0
  37. package/jest.config.integration.fixtures.js +22 -0
  38. package/jest.config.integration.js +21 -18
  39. package/jest.config.isolated.js +10 -0
  40. package/jest.projects.js +301 -0
  41. package/lib/api/certificates.api.js +62 -0
  42. package/lib/api/datasources-core.api.js +3 -3
  43. package/lib/api/dev-mtls-request.js +110 -0
  44. package/lib/api/dev-server-https.js +145 -0
  45. package/lib/api/dev.api.js +133 -144
  46. package/lib/api/index.js +11 -3
  47. package/lib/api/pipeline.api.js +67 -20
  48. package/lib/api/types/certificates.types.js +48 -0
  49. package/lib/api/types/dev.types.js +4 -3
  50. package/lib/api/types/pipeline.types.js +8 -5
  51. package/lib/api/types/validation-run.types.js +56 -0
  52. package/lib/api/validation-run.api.js +111 -0
  53. package/lib/api/validation-runner.js +109 -0
  54. package/lib/app/certification-show-enrich.js +129 -0
  55. package/lib/app/certification-verify-rows.js +60 -0
  56. package/lib/app/config.js +1 -1
  57. package/lib/app/deploy-status-display.js +2 -2
  58. package/lib/app/deploy.js +7 -6
  59. package/lib/app/display.js +2 -1
  60. package/lib/app/dockerfile.js +3 -2
  61. package/lib/app/down.js +2 -1
  62. package/lib/app/helpers.js +6 -5
  63. package/lib/app/index.js +27 -8
  64. package/lib/app/list.js +7 -6
  65. package/lib/app/push.js +4 -3
  66. package/lib/app/register.js +16 -7
  67. package/lib/app/rotate-secret.js +14 -13
  68. package/lib/app/run-container-start.js +184 -0
  69. package/lib/app/run-docker-fallback.js +108 -0
  70. package/lib/app/run-env-compose.js +30 -42
  71. package/lib/app/run-helpers.js +49 -126
  72. package/lib/app/run-infra-requirements.js +30 -0
  73. package/lib/app/run-resolve-image.js +21 -0
  74. package/lib/app/run.js +74 -21
  75. package/lib/app/show-display.js +44 -1
  76. package/lib/app/show.js +93 -9
  77. package/lib/build/index.js +13 -10
  78. package/lib/certification/cli-cert-sync-skip.js +21 -0
  79. package/lib/certification/merge-certification-from-artifact.js +185 -0
  80. package/lib/certification/post-unified-cert-sync.js +33 -0
  81. package/lib/certification/sync-after-external-command.js +52 -0
  82. package/lib/certification/sync-system-certification.js +197 -0
  83. package/lib/cli/index.js +2 -0
  84. package/lib/cli/setup-app.help.js +67 -0
  85. package/lib/cli/setup-app.js +61 -121
  86. package/lib/cli/setup-app.test-commands.js +195 -0
  87. package/lib/cli/setup-auth.js +19 -5
  88. package/lib/cli/setup-credential-deployment.js +22 -8
  89. package/lib/cli/setup-dev-path-commands.js +124 -0
  90. package/lib/cli/setup-dev.js +170 -113
  91. package/lib/cli/setup-environment.js +7 -1
  92. package/lib/cli/setup-external-system.js +84 -23
  93. package/lib/cli/setup-infra.js +126 -47
  94. package/lib/cli/setup-parameters.js +32 -0
  95. package/lib/cli/setup-secrets.js +137 -18
  96. package/lib/cli/setup-service-user.js +1 -1
  97. package/lib/cli/setup-utility.js +54 -22
  98. package/lib/commands/app-down.js +5 -7
  99. package/lib/commands/app-install.js +14 -7
  100. package/lib/commands/app-logs.js +13 -10
  101. package/lib/commands/app-shell.js +4 -1
  102. package/lib/commands/app-test.js +25 -19
  103. package/lib/commands/app.js +32 -11
  104. package/lib/commands/auth-config.js +6 -6
  105. package/lib/commands/auth-status.js +4 -3
  106. package/lib/commands/credential-env.js +4 -3
  107. package/lib/commands/credential-list.js +5 -4
  108. package/lib/commands/credential-push.js +4 -3
  109. package/lib/commands/datasource-unified-test-cli.js +428 -0
  110. package/lib/commands/datasource-unified-test-cli.options.js +191 -0
  111. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
  112. package/lib/commands/datasource-validation-cli.js +143 -0
  113. package/lib/commands/datasource.js +125 -95
  114. package/lib/commands/deployment-list.js +6 -5
  115. package/lib/commands/dev-cli-handlers.js +122 -18
  116. package/lib/commands/dev-down.js +4 -3
  117. package/lib/commands/dev-init.js +231 -116
  118. package/lib/commands/dev-show-display.js +473 -0
  119. package/lib/commands/login-credentials.js +3 -2
  120. package/lib/commands/login-device.js +4 -3
  121. package/lib/commands/login.js +5 -4
  122. package/lib/commands/logout.js +8 -7
  123. package/lib/commands/parameters-validate.js +54 -0
  124. package/lib/commands/repair-datasource.js +314 -68
  125. package/lib/commands/repair-env-template.js +2 -2
  126. package/lib/commands/repair.js +21 -3
  127. package/lib/commands/secrets-list.js +23 -12
  128. package/lib/commands/secrets-remove-all.js +220 -0
  129. package/lib/commands/secrets-remove.js +21 -12
  130. package/lib/commands/secrets-set.js +21 -12
  131. package/lib/commands/secrets-validate.js +4 -4
  132. package/lib/commands/secure.js +10 -9
  133. package/lib/commands/service-user.js +26 -25
  134. package/lib/commands/test-e2e-external.js +27 -1
  135. package/lib/commands/up-common.js +3 -2
  136. package/lib/commands/up-dataplane.js +29 -16
  137. package/lib/commands/up-miso.js +19 -29
  138. package/lib/commands/upload.js +149 -39
  139. package/lib/commands/wizard-core-helpers.js +1 -1
  140. package/lib/commands/wizard-dataplane.js +4 -3
  141. package/lib/commands/wizard-helpers.js +3 -3
  142. package/lib/commands/wizard.js +2 -2
  143. package/lib/core/admin-secrets.js +14 -5
  144. package/lib/core/audit-logger.js +12 -4
  145. package/lib/core/config-attach-extensions.js +46 -0
  146. package/lib/core/config-runtime-paths.js +29 -0
  147. package/lib/core/config.js +55 -56
  148. package/lib/core/diff.js +3 -2
  149. package/lib/core/ensure-encryption-key.js +1 -1
  150. package/lib/core/secrets-ensure-infra.js +77 -0
  151. package/lib/core/secrets-ensure.js +120 -64
  152. package/lib/core/secrets-env-write.js +35 -7
  153. package/lib/core/secrets-infra-placeholder-sync.js +61 -0
  154. package/lib/core/secrets.js +200 -37
  155. package/lib/core/templates-env.js +4 -3
  156. package/lib/datasource/abac-validator.js +1 -10
  157. package/lib/datasource/deploy.js +75 -53
  158. package/lib/datasource/field-reference-validator.js +9 -6
  159. package/lib/datasource/integration-context.js +63 -0
  160. package/lib/datasource/list.js +8 -7
  161. package/lib/datasource/log-viewer.js +189 -67
  162. package/lib/datasource/resolve-app.js +4 -4
  163. package/lib/datasource/test-e2e.js +113 -146
  164. package/lib/datasource/test-integration.js +114 -122
  165. package/lib/datasource/unified-validation-run-body.js +68 -0
  166. package/lib/datasource/unified-validation-run-post.js +23 -0
  167. package/lib/datasource/unified-validation-run-resolve.js +43 -0
  168. package/lib/datasource/unified-validation-run.js +93 -0
  169. package/lib/datasource/validate.js +157 -13
  170. package/lib/deployment/deployer.js +4 -3
  171. package/lib/deployment/environment.js +7 -6
  172. package/lib/deployment/push.js +17 -8
  173. package/lib/external-system/delete.js +4 -3
  174. package/lib/external-system/deploy.js +166 -53
  175. package/lib/external-system/download-helpers.js +1 -1
  176. package/lib/external-system/download.js +7 -6
  177. package/lib/external-system/generator.js +92 -6
  178. package/lib/external-system/integration-test-dispatch.js +26 -0
  179. package/lib/external-system/test-execution.js +5 -1
  180. package/lib/external-system/test-helpers.js +0 -4
  181. package/lib/external-system/test-system-level-helpers.js +110 -0
  182. package/lib/external-system/test-system-level.js +83 -44
  183. package/lib/external-system/test.js +59 -8
  184. package/lib/generator/builders.js +23 -11
  185. package/lib/generator/deploy-manifest-azure-kv.js +81 -0
  186. package/lib/generator/external.js +16 -4
  187. package/lib/generator/helpers.js +58 -3
  188. package/lib/generator/index.js +4 -0
  189. package/lib/generator/split-readme.js +12 -7
  190. package/lib/generator/split-variables.js +2 -1
  191. package/lib/generator/split.js +1 -1
  192. package/lib/generator/wizard-readme.js +3 -3
  193. package/lib/generator/wizard.js +8 -8
  194. package/lib/infrastructure/compose.js +70 -7
  195. package/lib/infrastructure/helpers-docker-check.js +67 -0
  196. package/lib/infrastructure/helpers.js +203 -42
  197. package/lib/infrastructure/index.js +31 -18
  198. package/lib/infrastructure/services.js +21 -67
  199. package/lib/internal/fs-real-sync.js +104 -0
  200. package/lib/internal/node-fs.js +98 -0
  201. package/lib/parameters/database-secret-values.js +173 -0
  202. package/lib/parameters/infra-kv-discovery.js +121 -0
  203. package/lib/parameters/infra-parameter-catalog.js +458 -0
  204. package/lib/parameters/infra-parameter-validate.js +64 -0
  205. package/lib/schema/application-schema.json +37 -17
  206. package/lib/schema/datasource-test-run.schema.json +493 -0
  207. package/lib/schema/deployment-rules.yaml +102 -63
  208. package/lib/schema/external-datasource.schema.json +1200 -442
  209. package/lib/schema/external-system.schema.json +203 -5
  210. package/lib/schema/flag-map-validation-run.json +31 -0
  211. package/lib/schema/infra-parameter.schema.json +106 -0
  212. package/lib/schema/infra.parameter.yaml +421 -0
  213. package/lib/schema/type/credential-auth-templates.json +40 -0
  214. package/lib/schema/type/document-storage.json +226 -0
  215. package/lib/schema/type/message-service.json +123 -0
  216. package/lib/schema/type/vector-store.json +88 -0
  217. package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
  218. package/lib/utils/api-error-handler.js +2 -2
  219. package/lib/utils/api.js +77 -17
  220. package/lib/utils/app-register-api.js +3 -2
  221. package/lib/utils/app-register-auth.js +1 -1
  222. package/lib/utils/app-register-config.js +4 -4
  223. package/lib/utils/app-register-display.js +3 -2
  224. package/lib/utils/app-register-validator.js +3 -2
  225. package/lib/utils/app-run-containers.js +26 -22
  226. package/lib/utils/app-scoped-config.js +31 -0
  227. package/lib/utils/app-service-env-from-builder.js +164 -0
  228. package/lib/utils/build-copy.js +1 -1
  229. package/lib/utils/build-helpers.js +20 -20
  230. package/lib/utils/build-resolve-image.js +165 -0
  231. package/lib/utils/cli-layout-chalk.js +8 -0
  232. package/lib/utils/cli-test-layout-chalk.js +267 -0
  233. package/lib/utils/cli-utils.js +88 -11
  234. package/lib/utils/compose-db-passwords.js +138 -0
  235. package/lib/utils/compose-generate-docker-compose.js +216 -0
  236. package/lib/utils/compose-generator.js +197 -291
  237. package/lib/utils/compose-miso-env.js +18 -0
  238. package/lib/utils/compose-traefik-ingress-base.js +158 -0
  239. package/lib/utils/config-paths.js +166 -7
  240. package/lib/utils/config-scoped-resources-preference.js +41 -0
  241. package/lib/utils/configuration-env-resolver.js +11 -8
  242. package/lib/utils/controller-deployment-outcome.js +68 -0
  243. package/lib/utils/credential-display.js +2 -2
  244. package/lib/utils/credential-secrets-env.js +5 -5
  245. package/lib/utils/dataplane-pipeline-warning.js +4 -3
  246. package/lib/utils/datasource-test-run-capability-scope.js +43 -0
  247. package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
  248. package/lib/utils/datasource-test-run-debug-display.js +137 -0
  249. package/lib/utils/datasource-test-run-debug-slice.js +93 -0
  250. package/lib/utils/datasource-test-run-display.js +459 -0
  251. package/lib/utils/datasource-test-run-exit.js +83 -0
  252. package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
  253. package/lib/utils/datasource-test-run-report-version.js +51 -0
  254. package/lib/utils/datasource-test-run-schema-sync.js +59 -0
  255. package/lib/utils/datasource-test-run-tty-log.js +81 -0
  256. package/lib/utils/datasource-validation-watch.js +266 -0
  257. package/lib/utils/declarative-url-ports.js +47 -0
  258. package/lib/utils/derive-env-key-from-client-id.js +41 -0
  259. package/lib/utils/dev-ca-install.js +185 -23
  260. package/lib/utils/dev-cert-helper.js +266 -17
  261. package/lib/utils/dev-hosts-helper.js +307 -0
  262. package/lib/utils/dev-init-cert-hints.js +37 -0
  263. package/lib/utils/dev-init-health-messages.js +52 -0
  264. package/lib/utils/dev-init-resolve.js +86 -0
  265. package/lib/utils/dev-init-ssh-merge.js +65 -0
  266. package/lib/utils/dev-ssh-config-helper.js +196 -0
  267. package/lib/utils/dev-user-groups.js +93 -0
  268. package/lib/utils/docker-build.js +42 -17
  269. package/lib/utils/docker-exec.js +28 -0
  270. package/lib/utils/docker-manifest-public-port.js +116 -0
  271. package/lib/utils/docker-not-running-hint.js +52 -0
  272. package/lib/utils/docker.js +98 -11
  273. package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
  274. package/lib/utils/env-config-loader.js +10 -91
  275. package/lib/utils/env-copy.js +19 -10
  276. package/lib/utils/env-map.js +35 -8
  277. package/lib/utils/env-template.js +2 -2
  278. package/lib/utils/environment-scoped-resources.js +144 -0
  279. package/lib/utils/error-formatter.js +92 -13
  280. package/lib/utils/error-formatters/http-status-errors.js +6 -5
  281. package/lib/utils/error-formatters/network-errors.js +2 -1
  282. package/lib/utils/error-formatters/permission-errors.js +2 -1
  283. package/lib/utils/error-formatters/validation-errors.js +2 -1
  284. package/lib/utils/external-readme.js +8 -1
  285. package/lib/utils/external-system-display.js +242 -136
  286. package/lib/utils/external-system-local-test-tty.js +389 -0
  287. package/lib/utils/external-system-readiness-core.js +377 -0
  288. package/lib/utils/external-system-readiness-deploy-display.js +270 -0
  289. package/lib/utils/external-system-readiness-display-internals.js +150 -0
  290. package/lib/utils/external-system-readiness-display.js +186 -0
  291. package/lib/utils/external-system-system-test-tty-overview.js +120 -0
  292. package/lib/utils/external-system-system-test-tty.js +417 -0
  293. package/lib/utils/external-system-test-helpers.js +24 -6
  294. package/lib/utils/external-system-validators.js +30 -12
  295. package/lib/utils/health-check-url.js +119 -0
  296. package/lib/utils/health-check.js +59 -25
  297. package/lib/utils/help-builder.js +11 -8
  298. package/lib/utils/image-version.js +4 -8
  299. package/lib/utils/infra-containers.js +4 -7
  300. package/lib/utils/infra-env-defaults.js +162 -0
  301. package/lib/utils/infra-status-display.js +167 -0
  302. package/lib/utils/infra-status.js +16 -8
  303. package/lib/utils/local-secrets.js +3 -4
  304. package/lib/utils/paths.js +148 -47
  305. package/lib/utils/port-resolver.js +10 -23
  306. package/lib/utils/redis-env-scope.js +62 -0
  307. package/lib/utils/register-aifabrix-shell-env.js +204 -0
  308. package/lib/utils/remote-builder-validation.js +99 -0
  309. package/lib/utils/remote-dev-auth.js +117 -21
  310. package/lib/utils/remote-docker-env.js +67 -15
  311. package/lib/utils/remote-secrets-loader.js +13 -4
  312. package/lib/utils/resolve-docker-image-ref.js +124 -0
  313. package/lib/utils/schema-loader.js +22 -9
  314. package/lib/utils/secrets-bash-kv.js +25 -0
  315. package/lib/utils/secrets-generator.js +169 -49
  316. package/lib/utils/secrets-helpers.js +70 -59
  317. package/lib/utils/secrets-kv-scope.js +60 -0
  318. package/lib/utils/secrets-utils.js +32 -38
  319. package/lib/utils/secrets-validation.js +3 -1
  320. package/lib/utils/secrets-yaml-preserve.js +109 -0
  321. package/lib/utils/ssh-key-helper.js +4 -2
  322. package/lib/utils/template-helpers.js +2 -2
  323. package/lib/utils/test-log-writer.js +3 -3
  324. package/lib/utils/token-manager.js +1 -2
  325. package/lib/utils/url-declarative-public-base.js +188 -0
  326. package/lib/utils/url-declarative-resolve-build.js +493 -0
  327. package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
  328. package/lib/utils/url-declarative-resolve.js +220 -0
  329. package/lib/utils/url-declarative-token-parse.js +74 -0
  330. package/lib/utils/url-declarative-url-flags.js +50 -0
  331. package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
  332. package/lib/utils/url-public-path-prefix.js +34 -0
  333. package/lib/utils/urls-local-registry.js +220 -0
  334. package/lib/utils/validation-report-tty-kit.js +77 -0
  335. package/lib/utils/validation-run-poll.js +112 -0
  336. package/lib/utils/validation-run-post-retry.js +85 -0
  337. package/lib/utils/validation-run-request.js +116 -0
  338. package/lib/utils/variable-transformer.js +21 -4
  339. package/lib/utils/yaml-preserve.js +33 -14
  340. package/lib/validation/datasource-warnings.js +56 -0
  341. package/lib/validation/env-template-auth.js +1 -1
  342. package/lib/validation/external-manifest-validator.js +27 -7
  343. package/lib/validation/validate-display.js +37 -31
  344. package/lib/validation/validate-external-cert-sync.js +23 -0
  345. package/lib/validation/validate.js +8 -14
  346. package/lib/validation/validator-unresolved-placeholders.js +98 -0
  347. package/lib/validation/validator.js +22 -65
  348. package/lib/validation/wizard-config-validator.js +2 -1
  349. package/package.json +9 -4
  350. package/scripts/check-datasource-test-run-schema-sync.js +34 -0
  351. package/scripts/diagnose-cli.js +150 -0
  352. package/scripts/install-local.js +307 -55
  353. package/scripts/pnpm-global-remove.js +48 -0
  354. package/templates/README.md +15 -2
  355. package/templates/applications/dataplane/application.yaml +52 -2
  356. package/templates/applications/dataplane/env.template +79 -17
  357. package/templates/applications/dataplane/rbac.yaml +8 -0
  358. package/templates/applications/keycloak/application.yaml +9 -1
  359. package/templates/applications/keycloak/env.template +15 -6
  360. package/templates/applications/miso-controller/application.yaml +10 -2
  361. package/templates/applications/miso-controller/env.template +42 -12
  362. package/templates/applications/miso-controller/rbac.yaml +5 -0
  363. package/templates/external-system/README.md.hbs +20 -7
  364. package/templates/external-system/deploy.js.hbs +5 -5
  365. package/templates/external-system/external-datasource.yaml.hbs +197 -118
  366. package/templates/infra/compose.yaml.hbs +33 -16
  367. package/templates/infra/servers.json.hbs +3 -1
  368. package/templates/python/docker-compose.hbs +16 -0
  369. package/templates/typescript/docker-compose.hbs +16 -0
  370. package/lib/api/external-test.api.js +0 -111
  371. package/lib/schema/env-config.yaml +0 -60
@@ -10,38 +10,159 @@
10
10
  * @version 2.0.0
11
11
  */
12
12
 
13
- const { execSync } = require('child_process');
13
+ const { execSync, execFileSync } = require('child_process');
14
14
  const fs = require('fs');
15
+ const os = require('os');
15
16
  const path = require('path');
16
17
 
18
+ const { runPnpmGlobalRemove } = require('./pnpm-global-remove');
19
+
20
+ const PACKAGE_NAME = '@aifabrix/builder';
21
+ /** Primary CLI name used for “current version” before link */
22
+ const PRIMARY_BIN = 'aifabrix';
23
+
24
+ /**
25
+ * Default PNPM_HOME when not set in the environment (matches `pnpm setup` on Linux/macOS; Windows uses LOCALAPPDATA).
26
+ * @returns {string} Resolved PNPM global bin home directory
27
+ */
28
+ function defaultPnpmHome() {
29
+ if (process.env.PNPM_HOME) {
30
+ return process.env.PNPM_HOME;
31
+ }
32
+ if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
33
+ return path.join(process.env.LOCALAPPDATA, 'pnpm');
34
+ }
35
+ return path.join(os.homedir(), '.local', 'share', 'pnpm');
36
+ }
37
+
38
+ /**
39
+ * Environment with PNPM_HOME and PATH set so `pnpm link --global` can find the global bin dir
40
+ * (same idea as aifabrix-setup/scripts/install-local.js).
41
+ * @returns {NodeJS.ProcessEnv} Copy of process.env with pnpm paths prepended
42
+ */
43
+ function pnpmEnv() {
44
+ const env = { ...process.env };
45
+ const pnpmHome = defaultPnpmHome();
46
+ env.PNPM_HOME = pnpmHome;
47
+ env.PATH = [pnpmHome, env.PATH].filter(Boolean).join(path.delimiter);
48
+ return env;
49
+ }
50
+
17
51
  /**
18
52
  * Detect which package manager is being used (pnpm or npm)
19
53
  * @returns {string} 'pnpm' or 'npm'
20
54
  */
21
55
  function detectPackageManager() {
22
56
  try {
23
- // Check if pnpm is available
24
57
  execSync('which pnpm', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
25
58
  return 'pnpm';
26
59
  } catch {
27
- // Fall back to npm
28
60
  return 'npm';
29
61
  }
30
62
  }
31
63
 
32
64
  /**
33
- * Get currently installed version of aifabrix CLI
34
- * @returns {string|null} Version string or null if not installed
65
+ * Reads package.json `bin` keys (or default primary bin).
66
+ * @returns {string[]} CLI executable names published by this package
35
67
  */
36
- function getCurrentVersion() {
68
+ function listCliBinNames() {
37
69
  try {
38
- const version = execSync('aifabrix --version', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
39
- return version;
70
+ const packageJsonPath = path.join(__dirname, '..', 'package.json');
71
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
72
+ const bin = packageJson.bin;
73
+ if (!bin) return [PRIMARY_BIN];
74
+ if (typeof bin === 'string') return [PRIMARY_BIN];
75
+ return Object.keys(bin);
76
+ } catch {
77
+ return [PRIMARY_BIN];
78
+ }
79
+ }
80
+
81
+ /**
82
+ * @param {string} binName - CLI name on PATH
83
+ * @param {NodeJS.ProcessEnv} [env] - Optional env (e.g. pnpm-adjusted PATH)
84
+ * @returns {string|null} Trimmed `--version` output or null if command fails
85
+ */
86
+ function getBinVersion(binName, env) {
87
+ try {
88
+ return execSync(`${binName} --version`, {
89
+ encoding: 'utf8',
90
+ stdio: ['ignore', 'pipe', 'ignore'],
91
+ env: env || process.env
92
+ }).trim();
40
93
  } catch {
41
94
  return null;
42
95
  }
43
96
  }
44
97
 
98
+ /**
99
+ * @param {string} binName - CLI name on PATH
100
+ * @param {NodeJS.ProcessEnv} [env] - Optional env for `which`
101
+ * @returns {string|null} First resolved path or null
102
+ */
103
+ function getBinPath(binName, env) {
104
+ try {
105
+ const which = execSync(`which ${binName}`, {
106
+ encoding: 'utf8',
107
+ stdio: ['ignore', 'pipe', 'ignore'],
108
+ env: env || process.env
109
+ }).trim();
110
+ return which || null;
111
+ } catch {
112
+ return null;
113
+ }
114
+ }
115
+
116
+ /**
117
+ * First executable `binName` on PATH (same resolution order as a POSIX shell).
118
+ * @param {string} binName - CLI name
119
+ * @param {string} pathString - PATH value (e.g. process.env.PATH)
120
+ * @returns {{ candidate: string, real: string }|null} First hit or null
121
+ */
122
+ function firstExecutableOnPath(binName, pathString) {
123
+ if (process.platform === 'win32') {
124
+ return null;
125
+ }
126
+ const dirs = (pathString || '').split(path.delimiter).filter(Boolean);
127
+ for (const dir of dirs) {
128
+ const candidate = path.join(dir, binName);
129
+ try {
130
+ const st = fs.lstatSync(candidate);
131
+ if (!st.isFile() && !st.isSymbolicLink()) continue;
132
+ fs.accessSync(candidate, fs.constants.X_OK);
133
+ const real = fs.realpathSync(candidate);
134
+ return { candidate, real };
135
+ } catch {
136
+ // continue
137
+ }
138
+ }
139
+ return null;
140
+ }
141
+
142
+ /**
143
+ * @param {string} executablePath - Absolute path to CLI
144
+ * @returns {string|null} Trimmed --version or null
145
+ */
146
+ function versionAtExecutablePath(executablePath) {
147
+ try {
148
+ return execFileSync(executablePath, ['--version'], {
149
+ encoding: 'utf8',
150
+ stdio: ['ignore', 'pipe', 'ignore']
151
+ }).trim();
152
+ } catch {
153
+ return null;
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Get currently installed version of primary CLI (aifabrix)
159
+ * @param {NodeJS.ProcessEnv} [env] - Optional env for the version probe
160
+ * @returns {string|null} Trimmed version or null if not on PATH
161
+ */
162
+ function getCurrentVersion(env) {
163
+ return getBinVersion(PRIMARY_BIN, env);
164
+ }
165
+
45
166
  /**
46
167
  * Get version from local package.json
47
168
  * @returns {string|null} Version string or null if not found
@@ -81,53 +202,192 @@ function displayVersionInfo(currentVersion, packageVersion) {
81
202
  }
82
203
  }
83
204
 
205
+ /**
206
+ * @typedef {{ name: string, path: string|null, real: string|null, version: string|null }} PathBinRow
207
+ */
208
+
209
+ /**
210
+ * @param {string[]} binNames - CLI names from package.json
211
+ * @returns {PathBinRow[]} Resolution rows for current PATH
212
+ */
213
+ function collectPathResolutionRows(binNames) {
214
+ const rows = [];
215
+ if (process.platform === 'win32') {
216
+ for (const name of binNames) {
217
+ const p = getBinPath(name, process.env);
218
+ const version = p
219
+ ? versionAtExecutablePath(p) || getBinVersion(name, process.env)
220
+ : getBinVersion(name, process.env);
221
+ rows.push({ name, path: p, real: p, version });
222
+ }
223
+ return rows;
224
+ }
225
+ for (const name of binNames) {
226
+ const hit = firstExecutableOnPath(name, process.env.PATH);
227
+ if (!hit) {
228
+ rows.push({ name, path: null, real: null, version: null });
229
+ continue;
230
+ }
231
+ const version =
232
+ versionAtExecutablePath(hit.candidate) || getBinVersion(name, process.env);
233
+ rows.push({ name, path: hit.candidate, real: hit.real, version });
234
+ }
235
+ return rows;
236
+ }
237
+
238
+ /**
239
+ * @param {PathBinRow[]} rows - Rows from collectPathResolutionRows
240
+ * @param {boolean} multipleBins - Whether package exposes more than one CLI name
241
+ * @returns {void}
242
+ */
243
+ function printPathResolutionTable(rows, multipleBins) {
244
+ const label = multipleBins
245
+ ? 'First match on your PATH for each command (what new programs see):'
246
+ : 'First match on your PATH (what new programs see):';
247
+ console.log(`\n${label}`);
248
+ for (const r of rows) {
249
+ if (!r.path) {
250
+ console.log(` ${r.name}: (not found on PATH)`);
251
+ continue;
252
+ }
253
+ const ver = r.version !== null && r.version !== undefined ? r.version : '(could not run --version)';
254
+ const arrow = r.real !== r.path ? ` → ${r.real}` : '';
255
+ console.log(` ${r.name}: ${r.path}${arrow} → ${ver}`);
256
+ }
257
+ }
258
+
259
+ /**
260
+ * @param {PathBinRow[]} rows - Rows from collectPathResolutionRows
261
+ * @param {string|null} expectedVersion - Linked package version
262
+ * @param {string[]} binNames - Bin names (length for multi-alias tip)
263
+ * @returns {void}
264
+ */
265
+ function printPathResolutionWarnings(rows, expectedVersion, binNames) {
266
+ const versions = rows
267
+ .map((r) => r.version)
268
+ .filter((v) => v !== null && v !== undefined && v !== '(could not run --version)');
269
+ const uniq = [...new Set(versions)];
270
+ const mismatchAliases = uniq.length > 1;
271
+ const hasStaleVers =
272
+ Boolean(expectedVersion) &&
273
+ rows.some(
274
+ (r) => r.version !== null && r.version !== undefined && r.version !== expectedVersion
275
+ );
276
+
277
+ if (hasStaleVers) {
278
+ console.log(`\n⚠️ At least one command above is not ${expectedVersion} (linked package version).`);
279
+ console.log(' Another install is winning on PATH for that name — often an old npm global copy.');
280
+ console.log(' Try: pnpm run diagnose:cli');
281
+ console.log(` Then: npm uninstall -g ${PACKAGE_NAME}`);
282
+ console.log(' Put PNPM_HOME (or ~/.local/share/pnpm) before other global bin dirs in PATH if needed.');
283
+ }
284
+
285
+ if (mismatchAliases) {
286
+ console.log('\n⚠️ `af` and `aifabrix` resolve to different installs on PATH.');
287
+ console.log(' Fix PATH as above, or if PATH looks correct, your shell may be using a stale location for one of them.');
288
+ console.log(' Bash: hash -r Zsh: rehash Then run both with --version again.');
289
+ } else if (binNames.length > 1 && expectedVersion && uniq.length === 1 && uniq[0] === expectedVersion) {
290
+ console.log('\nTip: Bash caches `af` and `aifabrix` separately. If your terminal shows a wrong version for only one, run: hash -r');
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Report first PATH hit per bin (matches new subprocesses). Warn on mismatch vs link or between aliases.
296
+ * Bash/zsh cache each command name separately — `af` can stay stale while `aifabrix` updates; suggest hash -r.
297
+ * @param {string|null} expectedVersion - Version from the linked package (pnpm env probe)
298
+ * @param {string[]} binNames - All bin entries from package.json
299
+ * @returns {void}
300
+ */
301
+ function reportCliAliasesOnPath(expectedVersion, binNames) {
302
+ if (!binNames.length) return;
303
+ const rows = collectPathResolutionRows(binNames);
304
+ printPathResolutionTable(rows, binNames.length > 1);
305
+ printPathResolutionWarnings(rows, expectedVersion, binNames);
306
+ }
307
+
308
+ /**
309
+ * Prints pnpm-specific hints when shell PATH still resolves an old binary.
310
+ * @param {boolean} usedPnpm - Whether link used pnpm
311
+ * @param {string|null} newVersion - Version after link
312
+ * @param {Object} [pathInfo] - Shell vs linked path probe
313
+ * @param {string|null} [pathInfo.versionInShell] - Version from default shell env
314
+ * @param {string|null} [pathInfo.linkedPath] - Path under pnpm env
315
+ * @returns {void}
316
+ */
317
+ function printPnpmPathHints(usedPnpm, newVersion, pathInfo) {
318
+ if (!usedPnpm) return;
319
+ const shellVersion = pathInfo && pathInfo.versionInShell;
320
+ const linkedPath = pathInfo && pathInfo.linkedPath;
321
+ if (newVersion && shellVersion !== newVersion) {
322
+ console.log(`\n⚠️ Your shell is still running an older ${PRIMARY_BIN} (${shellVersion || 'unknown'}).`);
323
+ console.log(` The linked binary is at: ${linkedPath || 'unknown'}`);
324
+ console.log(' Fix: run source ~/.bashrc (or open a new terminal).');
325
+ console.log(' If it still shows the old version, put pnpm\'s global bin first in PATH, or run:');
326
+ console.log(` npm uninstall -g ${PACKAGE_NAME}`);
327
+ } else {
328
+ console.log('If you still see an old version, run: source ~/.bashrc (or open a new terminal)');
329
+ }
330
+ }
331
+
84
332
  /**
85
333
  * Display success message with version information
86
334
  * @param {string|null} currentVersion - Version before linking
87
335
  * @param {string|null} newVersion - Version after linking
336
+ * @param {boolean} [usedPnpm] - Link used pnpm
337
+ * @param {Object} [pathInfo] - Optional shell vs linked path info
338
+ * @param {string|null} [pathInfo.versionInShell] - Version from default shell env
339
+ * @param {string|null} [pathInfo.linkedPath] - Path under pnpm env
340
+ * @param {string[]} [binNames] - Bin names from package.json
88
341
  * @returns {void}
89
342
  */
90
- function displaySuccessMessage(currentVersion, newVersion) {
91
- console.log('\n✅ Successfully linked!');
343
+ function displaySuccessMessage(currentVersion, newVersion, usedPnpm, pathInfo, binNames) {
344
+ const bins = binNames && binNames.length ? binNames : [PRIMARY_BIN];
345
+ console.log('\n✔ Successfully linked!');
92
346
  if (currentVersion && newVersion && currentVersion !== newVersion) {
93
347
  console.log(`📊 Version updated: ${currentVersion} → ${newVersion}`);
94
348
  } else if (newVersion) {
95
349
  console.log(`📊 Installed version: ${newVersion}`);
96
350
  }
97
- console.log('Run "aifabrix --version" to verify.');
351
+ const verifyHint =
352
+ bins.length > 1
353
+ ? bins.map((b) => `${b} --version`).join('" or "')
354
+ : `${bins[0]} --version`;
355
+ console.log(`Run "${verifyHint}" to verify.`);
356
+ if (bins.length > 1) {
357
+ console.log(
358
+ 'If only one alias shows the wrong version in your terminal, clear the shell command cache (bash: hash -r, zsh: rehash).'
359
+ );
360
+ }
361
+
362
+ printPnpmPathHints(usedPnpm, newVersion, pathInfo);
363
+ reportCliAliasesOnPath(newVersion, bins);
98
364
  }
99
365
 
100
366
  /**
101
- * Run pnpm link --global and npm link from project root (handles pnpm global bin not set).
102
- * @param {string} projectRoot - Path to project root
367
+ * Runs global link and reports success (throws on failure).
368
+ * @param {string} pm - 'pnpm' or 'npm'
369
+ * @param {string|null} currentVersion - Version before link
370
+ * @param {string[]} binNames - CLI bin names
103
371
  * @returns {void}
104
- * @throws {Error} If linking fails when pnpm global bin is not configured
105
372
  */
106
- function runPnpmLink(projectRoot) {
107
- let pnpmLinked = false;
108
- try {
109
- execSync('pnpm link --global', { stdio: 'inherit', cwd: projectRoot });
110
- pnpmLinked = true;
111
- } catch (pnpmErr) {
112
- const msg = (pnpmErr.message || String(pnpmErr));
113
- if (msg.includes('global bin directory') || msg.includes('ERR_PNPM_NO_GLOBAL_BIN_DIR')) {
114
- console.log(
115
- '⚠️ pnpm global bin is not set up. Run "pnpm setup" and add PNPM_HOME to PATH, or we will use npm link.\n'
116
- );
117
- } else {
118
- throw pnpmErr;
119
- }
120
- }
121
- try {
373
+ function runGlobalLink(pm, currentVersion, binNames) {
374
+ const projectRoot = path.join(__dirname, '..');
375
+ const env = pm === 'pnpm' ? pnpmEnv() : undefined;
376
+ if (pm === 'pnpm') {
377
+ execSync('pnpm link --global', { stdio: 'inherit', cwd: projectRoot, env });
378
+ } else {
122
379
  execSync('npm link', { stdio: 'inherit', cwd: projectRoot });
123
- } catch {
124
- if (!pnpmLinked) {
125
- console.error(
126
- '\n💡 To fix: run "pnpm setup" and add the suggested line to your shell config, then run install:local again.'
127
- );
128
- throw new Error('Linking failed. pnpm global bin not configured and npm link failed.');
129
- }
130
380
  }
381
+
382
+ const newVersion = getCurrentVersion(env);
383
+ let pathInfo;
384
+ if (pm === 'pnpm') {
385
+ pathInfo = {
386
+ versionInShell: getCurrentVersion(),
387
+ linkedPath: getBinPath(PRIMARY_BIN, env)
388
+ };
389
+ }
390
+ displaySuccessMessage(currentVersion, newVersion, pm === 'pnpm', pathInfo, binNames);
131
391
  }
132
392
 
133
393
  /**
@@ -137,23 +397,17 @@ function runPnpmLink(projectRoot) {
137
397
  function installLocal() {
138
398
  const pm = detectPackageManager();
139
399
  const packageVersion = getPackageVersion();
400
+ const binNames = listCliBinNames();
140
401
  const currentVersion = getCurrentVersion();
141
402
 
142
403
  console.log(`Detected package manager: ${pm}\n`);
143
404
  displayVersionInfo(currentVersion, packageVersion);
144
- console.log('Linking @aifabrix/builder globally...\n');
405
+ console.log(`Linking ${PACKAGE_NAME} globally...\n`);
145
406
 
146
407
  try {
147
- const projectRoot = path.join(__dirname, '..');
148
- if (pm === 'pnpm') {
149
- runPnpmLink(projectRoot);
150
- } else {
151
- execSync('npm link', { stdio: 'inherit', cwd: projectRoot });
152
- }
153
- const newVersion = getCurrentVersion();
154
- displaySuccessMessage(currentVersion, newVersion);
408
+ runGlobalLink(pm, currentVersion, binNames);
155
409
  } catch (error) {
156
- console.error('\n Failed to link package:', error.message);
410
+ console.error('\n Failed to link package:', error.message);
157
411
  process.exit(1);
158
412
  }
159
413
  }
@@ -192,7 +446,7 @@ function displayUninstallVersionInfo(currentVersion, packageVersion) {
192
446
  * @returns {void}
193
447
  */
194
448
  function displayUninstallSuccess(pm, currentVersion) {
195
- console.log(`\n Successfully unlinked with ${pm}!`);
449
+ console.log(`\n Successfully unlinked with ${pm}!`);
196
450
  if (currentVersion) {
197
451
  console.log(`📊 Uninstalled version: ${currentVersion}`);
198
452
  }
@@ -208,22 +462,20 @@ function uninstallLocal() {
208
462
  const packageVersion = getPackageVersion();
209
463
 
210
464
  console.log(`Detected package manager: ${pm}\n`);
211
-
212
- // Show version information before unlinking
213
465
  displayUninstallVersionInfo(currentVersion, packageVersion);
214
-
215
- console.log('Unlinking @aifabrix/builder globally...\n');
466
+ console.log(`Unlinking ${PACKAGE_NAME} globally...\n`);
216
467
 
217
468
  try {
218
469
  if (pm === 'pnpm') {
219
- execSync('pnpm unlink --global @aifabrix/builder', { stdio: 'inherit' });
470
+ const env = { ...pnpmEnv(), CI: 'true' };
471
+ runPnpmGlobalRemove(env, PACKAGE_NAME);
220
472
  displayUninstallSuccess(pm, currentVersion);
221
473
  } else {
222
- execSync('npm unlink -g @aifabrix/builder', { stdio: 'inherit' });
474
+ execSync(`npm unlink -g ${PACKAGE_NAME}`, { stdio: 'inherit' });
223
475
  displayUninstallSuccess(pm, currentVersion);
224
476
  }
225
477
  } catch (error) {
226
- console.error('\n Failed to unlink package:', error.message);
478
+ console.error('\n Failed to unlink package:', error.message);
227
479
  process.exit(1);
228
480
  }
229
481
  }
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ /* eslint-disable no-console */
3
+
4
+ /**
5
+ * pnpm global remove with virtual-store repair retry (pnpm 9+ global layout).
6
+ * @fileoverview Used by install-local.js uninstall path
7
+ * @author AI Fabrix Team
8
+ */
9
+
10
+ const { execSync } = require('child_process');
11
+
12
+ /**
13
+ * @param {unknown} error - Thrown from execSync
14
+ * @returns {boolean} True when `pnpm i -g` repair may fix the failure
15
+ */
16
+ function isPnpmUnexpectedVirtualStoreError(error) {
17
+ const msg =
18
+ error && typeof error === 'object' && 'message' in error ? String(error.message) : String(error);
19
+ return msg.includes('ERR_PNPM_UNEXPECTED_VIRTUAL_STORE');
20
+ }
21
+
22
+ /**
23
+ * @param {NodeJS.ProcessEnv} env - Environment
24
+ * @returns {void} Nothing
25
+ */
26
+ function repairPnpmGlobalInstall(env) {
27
+ execSync('pnpm i -g', { stdio: 'inherit', env });
28
+ }
29
+
30
+ /**
31
+ * @param {NodeJS.ProcessEnv} env - pnpm env (e.g. pnpmEnv + CI)
32
+ * @param {string} packageName - Scoped package name to remove globally
33
+ * @returns {void} Nothing
34
+ */
35
+ function runPnpmGlobalRemove(env, packageName) {
36
+ try {
37
+ execSync(`pnpm remove -g ${packageName}`, { stdio: 'inherit', env });
38
+ } catch (firstError) {
39
+ if (!isPnpmUnexpectedVirtualStoreError(firstError)) throw firstError;
40
+ console.log(
41
+ '\n⚠️ pnpm global virtual store layout mismatch. Running `pnpm i -g` to repair, then retrying remove...\n'
42
+ );
43
+ repairPnpmGlobalInstall(env);
44
+ execSync(`pnpm remove -g ${packageName}`, { stdio: 'inherit', env });
45
+ }
46
+ }
47
+
48
+ module.exports = { runPnpmGlobalRemove };
@@ -8,7 +8,7 @@ The templates directory is organized as follows:
8
8
 
9
9
  ### Application Templates (for `--template` flag)
10
10
 
11
- Application templates are folder-based and located under `templates/applications/`. When you use `--template <name>`, the tool looks for `templates/applications/<name>/` and copies all files from that folder to `builder/<app>/`.
11
+ Application templates are folder-based and located under `templates/applications/`. When you use `--template <name>`, the tool looks for `templates/applications/<name>/` and copies all files from that folder to `builder/<appKey>/`.
12
12
 
13
13
  **Example:**
14
14
  - `templates/applications/miso-controller/` - Miso Controller application template
@@ -18,7 +18,7 @@ Application templates are folder-based and located under `templates/applications
18
18
  - Template folder must exist in `templates/applications/<name>/`
19
19
  - Template folder must contain at least one file
20
20
  - Hidden files (starting with `.`) are skipped
21
- - If a template includes a `Dockerfile`, it will be copied to `builder/<app>/Dockerfile` along with other files
21
+ - If a template includes a `Dockerfile`, it will be copied to `builder/<appKey>/Dockerfile` along with other files
22
22
 
23
23
  ### Language Templates
24
24
 
@@ -63,6 +63,19 @@ Extra workflow steps are located in `templates/github/steps/`. When you use `--g
63
63
  ### Health Check Configuration
64
64
  - `{{healthCheck.path}}` - Health check endpoint path (e.g., "/health")
65
65
  - `{{healthCheck.interval}}` - Health check interval in seconds
66
+ - `{{healthCheck.bashProbe}}` - When true, generated Docker Compose uses a bash TCP probe (no `curl` dependency) instead of `curl -f`.
67
+
68
+ **Why `bashProbe` exists**
69
+
70
+ Some application images intentionally do not ship with `curl` (for smaller images or stricter runtime environments). If Compose uses a `curl`-based healthcheck in those images, Docker will mark the container as **unhealthy** even when the app is actually serving traffic.
71
+
72
+ Set `healthCheck.bashProbe: true` to make Compose healthchecks work without `curl` by performing a minimal HTTP request over `/dev/tcp`.
73
+
74
+ ### Traefik (Docker Compose labels)
75
+
76
+ Generated compose includes `traefik.http.routers.<app>.service=<app>` so Traefik’s Docker provider always binds the router to the in-compose service (required for HTTP-only routers when TLS terminates at nginx).
77
+
78
+ Infra Traefik is started with `--providers.docker.allowEmptyServices=true` so routes are published while a container is still in Docker’s `starting` / `unhealthy` health state (common during slow boots or when a health probe differs from real readiness).
66
79
 
67
80
  ### Service Requirements
68
81
  - `{{requiresDatabase}}` - Database requirement flag (conditional db-init service)
@@ -5,7 +5,7 @@ app:
5
5
  description: "AI Fabrix Dataplane is a secure, in-tenant integration and automation layer that supplies governed, normalized, and explainable enterprise data to AI agents. Using CIP as a declarative standard, it enforces RBAC and ABAC, executes integrations, and exposes trusted data via MCP and OpenAPI."
6
6
  type: webapp
7
7
  language: python # Explicitly specify Python language
8
- version: 1.8.0
8
+ version: 1.9.5
9
9
 
10
10
  # Image Configuration
11
11
  # Set tag to match your build (e.g. aifabrix build dataplane -t v1.0.0 then tag: v1.0.0)
@@ -18,6 +18,16 @@ image:
18
18
 
19
19
  # Port Configuration
20
20
  port: 3001
21
+ environmentScopedResources: true
22
+
23
+ # Public path behind Azure Front Door / reverse proxy (used by url://public and urls.local.yaml).
24
+ # Traefik: host is expanded from developer-id + remote-server (hostname of `remote-server` in ~/.aifabrix/config.yaml).
25
+ # Path uses pattern below plus optional /dev|/tst prefix when env-scoped resources are effective (plan 117).
26
+ frontDoorRouting:
27
+ pattern: /data/*
28
+ enabled: true
29
+ host: ${DEV_USERNAME}.${REMOTE_HOST}
30
+ tls: ${TLS_ENABLED}
21
31
 
22
32
  # Azure Requirements
23
33
  requires:
@@ -51,7 +61,6 @@ build:
51
61
  context: ../.. # Docker build context (relative to builder/dataplane/)
52
62
  dockerfile: builder/dataplane/Dockerfile # Dockerfile path (relative to project root)
53
63
  envOutputPath: ../../.env # Copy to repo root for local dev
54
- localPort: 3011 # Port for local development (different from Docker port)
55
64
  language: python # Runtime language for template selection (typescript or python)
56
65
  reloadStart: uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001} --reload # PORT set from port above at run time; default 3001 must match port
57
66
 
@@ -98,6 +107,47 @@ configuration:
98
107
  - detailed
99
108
  - explain
100
109
 
110
+ - name: TRUST_CUSTOMER_POLICY_LEVEL
111
+ portalInput:
112
+ field: select
113
+ label: "Trust policy level (no-policy defaults)"
114
+ options:
115
+ - strict
116
+ - standard
117
+ - relaxed
118
+
119
+ - name: TRUST_PUBLISH_GATE_ENABLED
120
+ portalInput:
121
+ field: select
122
+ label: "Enforce trust gate on datasource publish"
123
+ options:
124
+ - "false"
125
+ - "true"
126
+
127
+ - name: TRUST_PROMOTE_GATE_ENABLED
128
+ portalInput:
129
+ field: select
130
+ label: "Enforce trust gate on external system publish (promote scope)"
131
+ options:
132
+ - "false"
133
+ - "true"
134
+
135
+ - name: TRUST_RUNTIME_GATE_ENABLED
136
+ portalInput:
137
+ field: select
138
+ label: "Enforce trust gate on CIP execution (runtime scope)"
139
+ options:
140
+ - "false"
141
+ - "true"
142
+
143
+ - name: TRUST_AI_EXPOSURE_GATE_ENABLED
144
+ portalInput:
145
+ field: select
146
+ label: "Enforce trust gate on AI document-storage prompt generation"
147
+ options:
148
+ - "false"
149
+ - "true"
150
+
101
151
  # -------------------------------------------------------------------------
102
152
  # CIP Execution - Resource Limits
103
153
  # -------------------------------------------------------------------------