@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
@@ -12,6 +12,7 @@
12
12
  const fs = require('fs');
13
13
  const path = require('path');
14
14
  const Ajv = require('ajv');
15
+ const addFormats = require('ajv-formats');
15
16
  const applicationSchema = require('../schema/application-schema.json');
16
17
  const externalSystemSchema = require('../schema/external-system.schema.json');
17
18
  const externalDataSourceSchema = require('../schema/external-datasource.schema.json');
@@ -57,7 +58,8 @@ async function loadVariablesYaml(appName, options = {}) {
57
58
  * @returns {Function} Compiled validator function
58
59
  */
59
60
  function setupAjvValidator() {
60
- const ajv = new Ajv({ allErrors: true, strict: false });
61
+ const ajv = new Ajv({ allErrors: true, strict: false, verbose: true });
62
+ addFormats(ajv);
61
63
  const externalSystemSchemaCopy = { ...externalSystemSchema };
62
64
  const externalDataSourceSchemaCopy = { ...externalDataSourceSchema };
63
65
 
@@ -65,6 +67,11 @@ function setupAjvValidator() {
65
67
  delete externalDataSourceSchemaCopy.$schema;
66
68
  }
67
69
 
70
+ // external-datasource.schema.json references these by $id (aifabrix://schema/type/*)
71
+ ajv.addSchema(require('../schema/type/document-storage.json'));
72
+ ajv.addSchema(require('../schema/type/message-service.json'));
73
+ ajv.addSchema(require('../schema/type/vector-store.json'));
74
+
68
75
  ajv.addSchema(externalSystemSchemaCopy, externalSystemSchema.$id);
69
76
  ajv.addSchema(externalDataSourceSchemaCopy, externalDataSourceSchema.$id);
70
77
  return ajv.compile(applicationSchema);
@@ -341,7 +348,8 @@ function validateDeploymentJson(deployment) {
341
348
 
342
349
  // verbose: true includes the actual data value in error objects for better error messages
343
350
  const ajv = new Ajv({ allErrors: true, strict: false, verbose: true });
344
- // Register external schemas with their $id (GitHub raw URLs)
351
+ addFormats(ajv);
352
+ // Register external schemas with their $id
345
353
  // Create copies to avoid modifying the original schemas
346
354
  const externalSystemSchemaCopy = { ...externalSystemSchema };
347
355
  const externalDataSourceSchemaCopy = { ...externalDataSourceSchema };
@@ -349,6 +357,10 @@ function validateDeploymentJson(deployment) {
349
357
  if (externalDataSourceSchemaCopy.$schema && externalDataSourceSchemaCopy.$schema.includes('2020-12')) {
350
358
  delete externalDataSourceSchemaCopy.$schema;
351
359
  }
360
+ // external-datasource.schema.json references these by $id (aifabrix://schema/type/*)
361
+ ajv.addSchema(require('../schema/type/document-storage.json'));
362
+ ajv.addSchema(require('../schema/type/message-service.json'));
363
+ ajv.addSchema(require('../schema/type/vector-store.json'));
352
364
  ajv.addSchema(externalSystemSchemaCopy, externalSystemSchema.$id);
353
365
  ajv.addSchema(externalDataSourceSchemaCopy, externalDataSourceSchema.$id);
354
366
  const validate = ajv.compile(applicationSchema);
@@ -356,72 +368,17 @@ function validateDeploymentJson(deployment) {
356
368
 
357
369
  return {
358
370
  valid,
359
- errors: valid ? [] : formatValidationErrors(validate.errors)
371
+ errors: valid ? [] : formatValidationErrors(validate.errors, {
372
+ deploymentManifest: deployment,
373
+ rootData: deployment
374
+ })
360
375
  };
361
376
  }
362
377
 
363
- /** Pattern matching ${VAR} style unresolved variables in strings */
364
- const UNRESOLVED_VAR_REGEX = /\$\{[^}]+\}/g;
365
-
366
- /**
367
- * Recursively finds all string values in obj that contain ${...} placeholders.
368
- * Used to ensure deployment manifest has no unresolved variables before deploy.
369
- *
370
- * @function findUnresolvedVariablesInObject
371
- * @param {Object} obj - Object to scan (e.g. deployment manifest)
372
- * @param {string} [prefix=''] - Path prefix for error reporting
373
- * @returns {string[]} List of paths with example placeholder (e.g. "port: ${PORT}")
374
- *
375
- * @example
376
- * findUnresolvedVariablesInObject({ port: '${PORT}' }) // ['port: ${PORT}']
377
- */
378
- function findUnresolvedVariablesInObject(obj, prefix = '') {
379
- const found = [];
380
- if (obj === null || obj === undefined) {
381
- return found;
382
- }
383
- if (typeof obj === 'string') {
384
- const matches = obj.match(UNRESOLVED_VAR_REGEX);
385
- if (matches && matches.length > 0) {
386
- const pathLabel = prefix || 'value';
387
- found.push(`${pathLabel}: ${matches[0]}`);
388
- }
389
- return found;
390
- }
391
- if (Array.isArray(obj)) {
392
- obj.forEach((item, i) => {
393
- found.push(...findUnresolvedVariablesInObject(item, `${prefix}[${i}]`));
394
- });
395
- return found;
396
- }
397
- if (typeof obj === 'object') {
398
- for (const [key, value] of Object.entries(obj)) {
399
- const path = prefix ? `${prefix}.${key}` : key;
400
- found.push(...findUnresolvedVariablesInObject(value, path));
401
- }
402
- return found;
403
- }
404
- return found;
405
- }
406
-
407
- /**
408
- * Validates that deployment manifest contains no unresolved ${...} variables.
409
- * Throws if any are found, with a message to use secret variables or literal values.
410
- *
411
- * @function validateNoUnresolvedVariablesInDeployment
412
- * @param {Object} deployment - Deployment manifest object
413
- * @throws {Error} If any ${...} placeholders are found
414
- */
415
- function validateNoUnresolvedVariablesInDeployment(deployment) {
416
- const unresolved = findUnresolvedVariablesInObject(deployment);
417
- if (unresolved.length > 0) {
418
- const examples = [...new Set(unresolved)].slice(0, 5).join(', ');
419
- throw new Error(
420
- `Deployment manifest contains unresolved variables (e.g. ${examples}). ` +
421
- 'Use secret variables (kv://) in env.template for sensitive values, and set the application port as a number in application.yaml.'
422
- );
423
- }
424
- }
378
+ const {
379
+ findUnresolvedVariablesInObject,
380
+ validateNoUnresolvedVariablesInDeployment
381
+ } = require('./validator-unresolved-placeholders');
425
382
 
426
383
  /**
427
384
  * Validates all application configuration files
@@ -1,3 +1,4 @@
1
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
1
2
  /**
2
3
  * @fileoverview Wizard configuration validator for wizard.yaml files
3
4
  * @author AI Fabrix Team
@@ -281,7 +282,7 @@ function displayValidationResults(result) {
281
282
  console.log(chalk.green('Wizard configuration is valid'));
282
283
  } else {
283
284
  // eslint-disable-next-line no-console
284
- console.log(chalk.red('Wizard configuration validation failed:'));
285
+ console.log(formatBlockingError('Wizard configuration validation failed:'));
285
286
  result.errors.forEach(error => {
286
287
  // eslint-disable-next-line no-console
287
288
  console.log(chalk.red(` - ${error}`));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aifabrix/builder",
3
- "version": "2.43.0",
3
+ "version": "2.44.1",
4
4
  "description": "AI Fabrix Local Fabric & Deployment SDK",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
@@ -8,6 +8,7 @@
8
8
  "af": "bin/aifabrix.js"
9
9
  },
10
10
  "scripts": {
11
+ "all": "npm run precommit && npm run test:manual && npm run test:integration:fixtures && npm run test:hubspot-wizard",
11
12
  "test": "node tests/scripts/test-wrapper.js",
12
13
  "test:ci": "bash tests/scripts/ci-simulate.sh",
13
14
  "test:same-as-github": "npm run build:ci",
@@ -15,6 +16,7 @@
15
16
  "test:coverage:nyc": "nyc --reporter=text --reporter=lcov --reporter=html jest --config jest.config.coverage.js --runInBand",
16
17
  "test:watch": "jest --watch",
17
18
  "test:integration": "jest --config jest.config.integration.js --runInBand",
19
+ "test:integration:fixtures": "jest --config jest.config.integration.fixtures.js --runInBand",
18
20
  "test:integration:python": "cross-env TEST_LANGUAGE=python jest --config jest.config.integration.js --runInBand",
19
21
  "test:integration:typescript": "cross-env TEST_LANGUAGE=typescript jest --config jest.config.integration.js --runInBand",
20
22
  "test:hubspot-wizard": "node integration/hubspot-test/test.js",
@@ -27,13 +29,16 @@
27
29
  "lint:ci": "eslint . --ext .js --format json --output-file eslint-report.json",
28
30
  "dev": "node bin/aifabrix.js",
29
31
  "build": "npm run lint && npm run test",
30
- "build:ci": "npm run lint && npm run test:ci",
32
+ "build:ci": "npm run lint && npm run check:schema-sync && npm run check:flags && npm run test:ci",
31
33
  "pack": "npm run build && npm pack",
32
34
  "validate": "npm run build",
33
35
  "prepublishOnly": "npm run validate",
34
36
  "precommit": "npm run lint:fix && npm run test",
35
- "install:local": "node scripts/install-local.js",
36
- "uninstall:local": "node scripts/install-local.js uninstall"
37
+ "install:local": "node scripts/install-local.js && which aifabrix && which af",
38
+ "uninstall:local": "node scripts/install-local.js uninstall && which aifabrix && which af",
39
+ "diagnose:cli": "node scripts/diagnose-cli.js",
40
+ "check:schema-sync": "node scripts/check-datasource-test-run-schema-sync.js",
41
+ "check:flags": "jest tests/lib/schema/flag-map-validation-run.test.js --runInBand --config jest.config.default.js"
37
42
  },
38
43
  "keywords": [
39
44
  "aifabrix",
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CI helper: fail when Builder lib/schema/datasource-test-run.schema.json drifts from Dataplane copy.
4
+ * @fileoverview Schema sync gate (plan §8.1)
5
+ */
6
+ /* eslint-disable no-console -- CLI script */
7
+
8
+ const path = require('path');
9
+ const { assertDatasourceTestRunSchemasInSync } = require('../lib/utils/datasource-test-run-schema-sync');
10
+
11
+ const root = path.join(__dirname, '..');
12
+ const builderSchema = path.join(root, 'lib/schema/datasource-test-run.schema.json');
13
+ const dpRoot = process.env.AIFABRIX_DATAPLANE_ROOT || path.join(root, '..', 'aifabrix-dataplane');
14
+ const dataplaneSchema = path.join(dpRoot, 'app/schemas/json/datasource-test-run.schema.json');
15
+
16
+ const strict = process.env.AIFABRIX_SCHEMA_SYNC_STRICT === '1';
17
+
18
+ try {
19
+ const result = assertDatasourceTestRunSchemasInSync(builderSchema, dataplaneSchema);
20
+ if (result.skipped) {
21
+ const msg = result.reason || 'Dataplane schema path missing';
22
+ if (strict) {
23
+ console.error(`Schema sync failed (strict): ${msg}`);
24
+ process.exit(1);
25
+ }
26
+ console.warn(`Schema sync skipped: ${msg}`);
27
+ process.exit(0);
28
+ }
29
+ console.log(`DatasourceTestRun schema OK (sha256 ${result.builderSha})`);
30
+ process.exit(0);
31
+ } catch (e) {
32
+ console.error(e.message || String(e));
33
+ process.exit(1);
34
+ }
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ /* eslint-disable no-console */
3
+
4
+ /**
5
+ * List every PATH hit for aifabrix / af and each --version (find duplicate installs).
6
+ *
7
+ * @fileoverview CLI path diagnostic for @aifabrix/builder
8
+ */
9
+
10
+ const { execFileSync, execSync } = require('child_process');
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+
14
+ /**
15
+ * Reads package.json `bin` field.
16
+ * @returns {Record<string, string>|string} Bin map or single path string
17
+ */
18
+ function readBins() {
19
+ const pkgPath = path.join(__dirname, '..', 'package.json');
20
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
21
+ return pkg.bin || { aifabrix: 'bin/aifabrix.js' };
22
+ }
23
+
24
+ /**
25
+ * Resolves every PATH directory that exposes an executable named `binName`.
26
+ * @param {string} binName - CLI name (e.g. aifabrix)
27
+ * @returns {Array<{ path: string, real: string }>} Deduped hits with real paths
28
+ */
29
+ function locationsOnPath(binName) {
30
+ if (process.platform === 'win32') {
31
+ try {
32
+ const out = execSync(`where ${binName}`, {
33
+ encoding: 'utf8',
34
+ stdio: ['ignore', 'pipe', 'ignore']
35
+ }).trim();
36
+ return out.split(/\r?\n/).filter(Boolean).map((p) => ({ path: p, real: p }));
37
+ } catch {
38
+ return [];
39
+ }
40
+ }
41
+
42
+ const dirs = (process.env.PATH || '').split(path.delimiter).filter(Boolean);
43
+ const out = [];
44
+ const seenReal = new Set();
45
+ for (const dir of dirs) {
46
+ const candidate = path.join(dir, binName);
47
+ try {
48
+ const st = fs.lstatSync(candidate);
49
+ if (!st.isFile() && !st.isSymbolicLink()) continue;
50
+ fs.accessSync(candidate, fs.constants.X_OK);
51
+ const real = fs.realpathSync(candidate);
52
+ if (seenReal.has(real)) continue;
53
+ seenReal.add(real);
54
+ out.push({ path: candidate, real });
55
+ } catch {
56
+ // not found or not executable
57
+ }
58
+ }
59
+ return out;
60
+ }
61
+
62
+ /**
63
+ * Runs `executablePath --version` and returns stdout or null on failure.
64
+ * @param {string} executablePath - Absolute path to the binary
65
+ * @returns {string|null} Trimmed version output
66
+ */
67
+ function versionAt(executablePath) {
68
+ try {
69
+ return execFileSync(executablePath, ['--version'], {
70
+ encoding: 'utf8',
71
+ stdio: ['ignore', 'pipe', 'ignore']
72
+ }).trim();
73
+ } catch {
74
+ return null;
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Prints PNPM_HOME and npm prefix for debugging PATH issues.
80
+ * @returns {void}
81
+ */
82
+ function printEnvironment() {
83
+ console.log('Environment (relevant to global CLIs)\n');
84
+ console.log(` PNPM_HOME ${process.env.PNPM_HOME || '(not set)'}`);
85
+ try {
86
+ const prefix = execSync('npm config get prefix', {
87
+ encoding: 'utf8',
88
+ stdio: ['ignore', 'pipe', 'ignore']
89
+ }).trim();
90
+ console.log(` npm prefix ${prefix}`);
91
+ } catch {
92
+ console.log(' npm prefix (could not read)');
93
+ }
94
+ console.log('');
95
+ }
96
+
97
+ /**
98
+ * @param {string[]} names - Bin names from package.json
99
+ * @returns {void}
100
+ */
101
+ function printBinReports(names) {
102
+ for (const name of names) {
103
+ console.log(`── ${name} ──`);
104
+ const hits = locationsOnPath(name);
105
+ if (!hits.length) {
106
+ console.log(' (not found on PATH)\n');
107
+ continue;
108
+ }
109
+ hits.forEach((h, i) => {
110
+ const ver = versionAt(h.path);
111
+ const marker = i === 0 ? ' ← first on PATH (what your shell runs)' : '';
112
+ console.log(` [${i + 1}] ${h.path}`);
113
+ if (h.real !== h.path) console.log(` → ${h.real}`);
114
+ console.log(` --version: ${ver ?? '(failed to run)'}${marker}`);
115
+ });
116
+ console.log('');
117
+ }
118
+ }
119
+
120
+ /**
121
+ * @param {string[]} names - Bin names from package.json
122
+ * @returns {void}
123
+ */
124
+ function warnIfMultipleVersions(names) {
125
+ const uniqVersions = new Set();
126
+ for (const name of names) {
127
+ for (const h of locationsOnPath(name)) {
128
+ const v = versionAt(h.path);
129
+ if (v) uniqVersions.add(v);
130
+ }
131
+ }
132
+ if (uniqVersions.size > 1) {
133
+ console.log('⚠ Multiple distinct --version values above: remove or reorder PATH so only one install remains.');
134
+ console.log(' Often: npm uninstall -g @aifabrix/builder, then ensure PNPM_HOME is before /usr/local/bin in PATH.\n');
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Entry: list PATH hits and versions for each package bin.
140
+ * @returns {void}
141
+ */
142
+ function main() {
143
+ const binField = readBins();
144
+ const names = typeof binField === 'string' ? ['aifabrix'] : Object.keys(binField);
145
+ printEnvironment();
146
+ printBinReports(names);
147
+ warnIfMultipleVersions(names);
148
+ }
149
+
150
+ main();