@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
@@ -16,12 +16,12 @@ const path = require('path');
16
16
  const os = require('os');
17
17
  const paths = require('../utils/paths');
18
18
 
19
- // Audit log file path (in user's home directory for compliance)
19
+ // Audit log file path (beside config.yaml / CLI system dir for compliance)
20
20
  let auditLogPath = null;
21
21
 
22
22
  /**
23
23
  * Gets the audit log file path
24
- * Creates .aifabrix directory in user's home if it doesn't exist
24
+ * Creates config / system directory if it doesn't exist
25
25
  * @returns {Promise<string>} Path to audit log file
26
26
  */
27
27
  async function getAuditLogPath() {
@@ -29,7 +29,7 @@ async function getAuditLogPath() {
29
29
  return auditLogPath;
30
30
  }
31
31
 
32
- const aifabrixDir = paths.getAifabrixHome();
32
+ const aifabrixDir = paths.getAifabrixSystemDir();
33
33
 
34
34
  try {
35
35
  await fs.mkdir(aifabrixDir, { recursive: true });
@@ -336,6 +336,13 @@ function extractPathFromUrl(url) {
336
336
  }
337
337
  }
338
338
 
339
+ /**
340
+ * Clears cached audit log path (for tests that vary getAifabrixSystemDir between calls).
341
+ */
342
+ function resetAuditLogPathCache() {
343
+ auditLogPath = null;
344
+ }
345
+
339
346
  module.exports = {
340
347
  auditLog,
341
348
  logDeploymentAttempt,
@@ -345,6 +352,7 @@ module.exports = {
345
352
  logApplicationCreation,
346
353
  logApiCall,
347
354
  maskSensitiveData,
348
- createAuditEntry
355
+ createAuditEntry,
356
+ resetAuditLogPathCache
349
357
  };
350
358
 
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Attach token, path, format, and scoped-resources helpers to config exports.
3
+ *
4
+ * @fileoverview Keeps lib/core/config.js under max-lines
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /**
12
+ * @param {object} exportsObj - Module exports object to mutate
13
+ * @param {object} deps
14
+ * @param {Function} deps.getConfig
15
+ * @param {Function} deps.saveConfig
16
+ * @param {Function} deps.getSecretsEncryptionKey
17
+ * @param {Function} deps.encryptTokenValue
18
+ * @param {Function} deps.decryptTokenValue
19
+ */
20
+ function attachConfigExtensions(exportsObj, deps) {
21
+ const { getConfig, saveConfig, getSecretsEncryptionKey, encryptTokenValue, decryptTokenValue } = deps;
22
+
23
+ const { createTokenManagementFunctions } = require('../utils/config-tokens');
24
+ Object.assign(
25
+ exportsObj,
26
+ createTokenManagementFunctions({
27
+ getConfigFn: getConfig,
28
+ saveConfigFn: saveConfig,
29
+ getSecretsEncryptionKeyFn: getSecretsEncryptionKey,
30
+ encryptTokenValueFn: encryptTokenValue,
31
+ decryptTokenValueFn: decryptTokenValue,
32
+ isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
33
+ })
34
+ );
35
+
36
+ const { createPathConfigFunctions } = require('../utils/config-paths');
37
+ Object.assign(exportsObj, createPathConfigFunctions(getConfig, saveConfig));
38
+
39
+ const { createFormatFunctions } = require('../utils/config-format-preference');
40
+ Object.assign(exportsObj, createFormatFunctions(getConfig, saveConfig));
41
+
42
+ const { createScopedResourcesPreferenceFunctions } = require('../utils/config-scoped-resources-preference');
43
+ Object.assign(exportsObj, createScopedResourcesPreferenceFunctions(getConfig, saveConfig));
44
+ }
45
+
46
+ module.exports = { attachConfigExtensions };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Resolves config.yaml directory/file on each access (aligned with paths.getConfigDirForPaths).
3
+ * Split from config.js for max-lines compliance.
4
+ *
5
+ * @fileoverview Dynamic CONFIG_DIR / CONFIG_FILE for lib/core/config.js
6
+ * @author AI Fabrix Team
7
+ * @version 2.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ const path = require('path');
13
+ const { getAifabrixRuntimeConfigDir } = require('../utils/aifabrix-runtime-config-dir');
14
+
15
+ /**
16
+ * @returns {string}
17
+ */
18
+ function getRuntimeConfigDir() {
19
+ return getAifabrixRuntimeConfigDir();
20
+ }
21
+
22
+ /**
23
+ * @returns {string}
24
+ */
25
+ function getRuntimeConfigFile() {
26
+ return path.join(getRuntimeConfigDir(), 'config.yaml');
27
+ }
28
+
29
+ module.exports = { getRuntimeConfigDir, getRuntimeConfigFile };
@@ -14,31 +14,9 @@ const yaml = require('js-yaml');
14
14
  const os = require('os');
15
15
  const { encryptToken, decryptToken, isTokenEncrypted } = require('../utils/token-encryption');
16
16
  const { ensureSecureFilePermissions, ensureSecureDirPermissions } = require('../utils/secure-file-permissions');
17
- // Avoid importing paths here to prevent circular dependency.
18
- // Config location (first match wins):
19
- // 1. AIFABRIX_CONFIG env = full path to config.yaml
20
- // 2. AIFABRIX_HOME env = directory containing config.yaml
21
- // 3. ~/.aifabrix
22
- // Set AIFABRIX_HOME=/workspace/.aifabrix or AIFABRIX_CONFIG=/workspace/.aifabrix/config.yaml when config is not in default home.
23
-
24
- function getConfigDir() {
25
- const configFile = process.env.AIFABRIX_CONFIG && typeof process.env.AIFABRIX_CONFIG === 'string';
26
- if (configFile) {
27
- return path.dirname(path.resolve(process.env.AIFABRIX_CONFIG.trim()));
28
- }
29
- if (process.env.AIFABRIX_HOME && typeof process.env.AIFABRIX_HOME === 'string') {
30
- return path.resolve(process.env.AIFABRIX_HOME.trim());
31
- }
32
- return path.join(os.homedir(), '.aifabrix');
33
- }
34
-
35
- // Runtime config directory and file (respect AIFABRIX_HOME)
36
- const RUNTIME_CONFIG_DIR = getConfigDir();
37
- const RUNTIME_CONFIG_FILE = path.join(RUNTIME_CONFIG_DIR, 'config.yaml');
38
-
39
- // Legacy exports (same as runtime when module loads)
40
- const CONFIG_DIR = RUNTIME_CONFIG_DIR;
41
- const CONFIG_FILE = RUNTIME_CONFIG_FILE;
17
+ const { getRuntimeConfigDir, getRuntimeConfigFile } = require('./config-runtime-paths');
18
+ // Avoid importing paths.js here to prevent circular dependency; use shared runtime config dir helper.
19
+ // Config location: AIFABRIX_CONFIG dirname AIFABRIX_HOME (with ~/.aifabrix fallback when config lives there) → ~/.aifabrix
42
20
 
43
21
  // Cache for developer ID - loaded when getConfig() is first called
44
22
  let cachedDeveloperId = null;
@@ -111,6 +89,9 @@ function applyConfigDefaults(config) {
111
89
  if (typeof config.device !== 'object' || config.device === null) {
112
90
  config.device = {};
113
91
  }
92
+ if (typeof config.useEnvironmentScopedResources === 'undefined') {
93
+ config.useEnvironmentScopedResources = false;
94
+ }
114
95
  // Ensure controller field exists (but don't set defaults)
115
96
  // It will be set by login or auth --set-controller
116
97
  return config;
@@ -128,15 +109,18 @@ function getDefaultConfig() {
128
109
  controller: undefined,
129
110
  environments: {},
130
111
  device: {},
131
- format: undefined
112
+ format: undefined,
113
+ useEnvironmentScopedResources: false
132
114
  };
133
115
  }
134
116
 
135
117
  async function getConfig() {
136
118
  try {
137
- ensureSecureDirPermissions(RUNTIME_CONFIG_DIR);
138
- ensureSecureFilePermissions(RUNTIME_CONFIG_FILE);
139
- const configContent = await fs.readFile(RUNTIME_CONFIG_FILE, 'utf8');
119
+ const dir = getRuntimeConfigDir();
120
+ const file = getRuntimeConfigFile();
121
+ ensureSecureDirPermissions(dir);
122
+ ensureSecureFilePermissions(file);
123
+ const configContent = await fs.readFile(file, 'utf8');
140
124
  let config = yaml.load(configContent);
141
125
 
142
126
  // Handle empty file or null/undefined result from yaml.load
@@ -168,20 +152,22 @@ async function getConfig() {
168
152
  */
169
153
  async function saveConfig(data) {
170
154
  try {
155
+ const dir = getRuntimeConfigDir();
156
+ const file = getRuntimeConfigFile();
171
157
  // Create directory if it doesn't exist
172
- await fs.mkdir(RUNTIME_CONFIG_DIR, { recursive: true });
158
+ await fs.mkdir(dir, { recursive: true });
173
159
 
174
160
  // Set secure permissions
175
161
  // Force quotes to ensure numeric-like strings (e.g., "01") remain strings in YAML
176
162
  const configContent = yaml.dump(data, { forceQuotes: true });
177
163
  // Write file first
178
- await fs.writeFile(RUNTIME_CONFIG_FILE, configContent, {
164
+ await fs.writeFile(file, configContent, {
179
165
  mode: 0o600,
180
166
  flag: 'w'
181
167
  });
182
168
  // Open file descriptor and fsync to ensure write is flushed to disk
183
169
  // This is critical on Windows where file writes may be cached
184
- const fd = await fs.open(RUNTIME_CONFIG_FILE, 'r+');
170
+ const fd = await fs.open(file, 'r+');
185
171
  try {
186
172
  await fd.sync();
187
173
  } finally {
@@ -198,7 +184,7 @@ async function saveConfig(data) {
198
184
  */
199
185
  async function clearConfig() {
200
186
  try {
201
- await fs.unlink(RUNTIME_CONFIG_FILE);
187
+ await fs.unlink(getRuntimeConfigFile());
202
188
  } catch (error) {
203
189
  if (error.code !== 'ENOENT') {
204
190
  throw new Error(`Failed to clear config: ${error.message}`);
@@ -236,8 +222,9 @@ async function getDeveloperId() {
236
222
  */
237
223
  async function verifyDeveloperIdSaved(devIdString) {
238
224
  await new Promise(resolve => setTimeout(resolve, 100));
239
- ensureSecureFilePermissions(RUNTIME_CONFIG_FILE);
240
- const savedContent = await fs.readFile(RUNTIME_CONFIG_FILE, 'utf8');
225
+ const file = getRuntimeConfigFile();
226
+ ensureSecureFilePermissions(file);
227
+ const savedContent = await fs.readFile(file, 'utf8');
241
228
  const savedConfig = yaml.load(savedContent);
242
229
  const savedDevIdString = String(savedConfig['developer-id']);
243
230
  if (savedDevIdString !== devIdString) {
@@ -262,6 +249,24 @@ async function getCurrentEnvironment() {
262
249
  return config.environment || 'dev';
263
250
  }
264
251
 
252
+ /**
253
+ * Whether infra TLS mode is enabled (`tlsEnabled: true` in config.yaml; e.g. after `up-infra --tls`).
254
+ * @returns {Promise<boolean>}
255
+ */
256
+ async function getTlsEnabled() {
257
+ const cfg = await getConfig();
258
+ return cfg.tlsEnabled === true;
259
+ }
260
+
261
+ /**
262
+ * Whether Traefik is enabled (`traefik: true` in config; infra compose includes the proxy).
263
+ * @returns {Promise<boolean>}
264
+ */
265
+ async function getTraefikEnabled() {
266
+ const cfg = await getConfig();
267
+ return cfg.traefik === true;
268
+ }
269
+
265
270
  /**
266
271
  * Resolve environment from configuration
267
272
  * Uses config.environment, defaults to 'dev'
@@ -448,6 +453,8 @@ const exportsObj = {
448
453
  setDeveloperId,
449
454
  loadDeveloperId,
450
455
  getCurrentEnvironment,
456
+ getTlsEnabled,
457
+ getTraefikEnabled,
451
458
  setCurrentEnvironment,
452
459
  resolveEnvironment,
453
460
  isTokenExpired,
@@ -462,8 +469,12 @@ const exportsObj = {
462
469
  normalizeControllerUrl,
463
470
  setControllerUrl,
464
471
  getControllerUrl,
465
- CONFIG_DIR,
466
- CONFIG_FILE
472
+ get CONFIG_DIR() {
473
+ return getRuntimeConfigDir();
474
+ },
475
+ get CONFIG_FILE() {
476
+ return getRuntimeConfigFile();
477
+ }
467
478
  };
468
479
 
469
480
  // Add developerId as a property getter for direct access
@@ -477,24 +488,12 @@ Object.defineProperty(exportsObj, 'developerId', {
477
488
  configurable: true
478
489
  });
479
490
 
480
- // Token management functions - created after dependencies are defined
481
- const { createTokenManagementFunctions } = require('../utils/config-tokens');
482
- const tokenFunctions = createTokenManagementFunctions({
483
- getConfigFn: getConfig,
484
- saveConfigFn: saveConfig,
485
- getSecretsEncryptionKeyFn: getSecretsEncryptionKey,
486
- encryptTokenValueFn: encryptTokenValue,
487
- decryptTokenValueFn: decryptTokenValue,
488
- isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
491
+ const { attachConfigExtensions } = require('./config-attach-extensions');
492
+ attachConfigExtensions(exportsObj, {
493
+ getConfig,
494
+ saveConfig,
495
+ getSecretsEncryptionKey,
496
+ encryptTokenValue,
497
+ decryptTokenValue
489
498
  });
490
- Object.assign(exportsObj, tokenFunctions);
491
-
492
- // Path configuration functions - created after getConfig/saveConfig are defined
493
- const { createPathConfigFunctions } = require('../utils/config-paths');
494
- const pathConfigFunctions = createPathConfigFunctions(getConfig, saveConfig);
495
- Object.assign(exportsObj, pathConfigFunctions);
496
- // Format preference functions
497
- const { createFormatFunctions } = require('../utils/config-format-preference');
498
- const formatFunctions = createFormatFunctions(getConfig, saveConfig);
499
- Object.assign(exportsObj, formatFunctions);
500
499
  module.exports = exportsObj;
package/lib/core/diff.js CHANGED
@@ -1,3 +1,4 @@
1
+ const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
1
2
  /**
2
3
  * File Comparison Utilities
3
4
  *
@@ -377,7 +378,7 @@ function displayVersionInfo(diffResult) {
377
378
  */
378
379
  function displayBreakingChanges(breakingChanges) {
379
380
  if (breakingChanges.length > 0) {
380
- logger.log(chalk.red('\n⚠️ Breaking Changes:'));
381
+ logger.log(chalk.red('\n Breaking Changes:'));
381
382
  breakingChanges.forEach(change => {
382
383
  logger.log(chalk.red(` • ${change.description}`));
383
384
  });
@@ -445,7 +446,7 @@ function formatDiffOutput(diffResult) {
445
446
  logger.log(chalk.blue(`\nComparing: ${diffResult.file1} ↔ ${diffResult.file2}`));
446
447
 
447
448
  if (diffResult.identical) {
448
- logger.log(chalk.green('\n✓ Files are identical'));
449
+ logger.log(formatSuccessParagraph('Files are identical'));
449
450
  return;
450
451
  }
451
452
 
@@ -37,7 +37,7 @@ async function ensureSecretsEncryptionKey(config) {
37
37
  const existing = await config.getSecretsEncryptionKey();
38
38
  if (existing) return;
39
39
 
40
- const userSecretsPath = path.join(pathsUtil.getAifabrixHome(), 'secrets.local.yaml');
40
+ const userSecretsPath = pathsUtil.getPrimaryUserSecretsLocalPath();
41
41
  const projectSecretsPath = await config.getSecretsPath();
42
42
 
43
43
  let key = readKeyFromFile(userSecretsPath);
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Infra catalog helpers for secrets-ensure (placeholder context, empty-allowed keys, up-infra key list).
3
+ * @fileoverview Split from secrets-ensure.js for max-lines compliance
4
+ */
5
+ 'use strict';
6
+
7
+ const path = require('path');
8
+ const logger = require('../utils/logger');
9
+ const pathsUtil = require('../utils/paths');
10
+ const { getAllInfraEnsureKeys } = require('../parameters/infra-kv-discovery');
11
+
12
+ /** Shipped infra.parameter.yaml (matches infra-parameter-catalog DEFAULT_CATALOG_PATH). Local join so partial Jest mocks cannot omit DEFAULT_CATALOG_PATH. */
13
+ const BUNDLED_INFRA_PARAMETER_YAML = path.join(__dirname, '..', 'schema', 'infra.parameter.yaml');
14
+
15
+ /**
16
+ * Lazy require so Jest mocks of infra-parameter-catalog apply when this module loads after mocks.
17
+ * @returns {typeof import('../parameters/infra-parameter-catalog')}
18
+ */
19
+ function infraParameterCatalogModule() {
20
+ return require('../parameters/infra-parameter-catalog');
21
+ }
22
+
23
+ /**
24
+ * Merge infra.parameter.yaml defaults with up-infra CLI options for {{placeholder}} expansion.
25
+ * @param {Object} [options]
26
+ * @returns {Record<string, string>}
27
+ */
28
+ function buildInfraPlaceholderContext(options) {
29
+ const cat = infraParameterCatalogModule();
30
+ try {
31
+ return cat.mergeInfraParameterDefaultsForCli(cat.getInfraParameterCatalog().data, options || {});
32
+ } catch {
33
+ return cat.mergeInfraParameterDefaultsForCli({}, options || {});
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Keys that may stay empty without backfill (catalog generator emptyAllowed).
39
+ * @param {string} key - Secret key
40
+ * @returns {boolean}
41
+ */
42
+ function isSecretKeyAllowedEmpty(key) {
43
+ const cat = infraParameterCatalogModule();
44
+ try {
45
+ return cat.getInfraParameterCatalog().isKeyAllowedEmpty(key);
46
+ } catch {
47
+ const emptyAllowed = cat.readRelaxedEmptyAllowedKeySet(BUNDLED_INFRA_PARAMETER_YAML);
48
+ return Boolean(emptyAllowed && emptyAllowed.has(key));
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Infra secret keys for up-infra: catalog (ensureOn upInfra) + workspace DB/template discovery
54
+ * + standard miso-controller multi-DB keys.
55
+ * @returns {string[]}
56
+ */
57
+ function getInfraSecretKeysForUpInfra() {
58
+ const cat = infraParameterCatalogModule();
59
+ try {
60
+ const catalog = cat.getInfraParameterCatalog();
61
+ return getAllInfraEnsureKeys(catalog, pathsUtil);
62
+ } catch (err) {
63
+ logger.warn(`Could not build infra secret key list from catalog (${err.message}); using relaxed YAML read.`);
64
+ const relaxed = cat.readRelaxedUpInfraEnsureKeyList(BUNDLED_INFRA_PARAMETER_YAML);
65
+ if (relaxed && relaxed.length > 0) {
66
+ return relaxed;
67
+ }
68
+ logger.warn('Relaxed read of infra.parameter.yaml produced no keys; up-infra may skip secret backfill.');
69
+ return [];
70
+ }
71
+ }
72
+
73
+ module.exports = {
74
+ buildInfraPlaceholderContext,
75
+ isSecretKeyAllowedEmpty,
76
+ getInfraSecretKeysForUpInfra
77
+ };