@aifabrix/builder 2.45.5 → 2.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/.cursor/rules/cli-layout.mdc +2 -0
  2. package/.cursor/rules/cli-product-neutral.mdc +43 -0
  3. package/.cursor/rules/project-rules.mdc +1 -0
  4. package/.npmrc.token +1 -0
  5. package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
  6. package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
  7. package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
  8. package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
  9. package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
  10. package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
  11. package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
  12. package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
  13. package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
  14. package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
  15. package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
  16. package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
  17. package/.temp/validation/summary.txt +5 -0
  18. package/README.md +43 -17
  19. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  20. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  21. package/jest.config.default.js +2 -1
  22. package/jest.config.isolated.js +2 -1
  23. package/jest.global-live-fabrix-hooks.js +36 -0
  24. package/jest.isolated-projects.js +146 -0
  25. package/jest.projects.js +65 -136
  26. package/lib/api/api-response-errors.js +124 -0
  27. package/lib/api/dataplane-health.api.js +19 -7
  28. package/lib/api/governance-scenario-pack.api.js +159 -0
  29. package/lib/api/index.js +43 -3
  30. package/lib/api/lifecycle.api.js +98 -0
  31. package/lib/api/pipeline.api.js +3 -1
  32. package/lib/api/records-bulk.api.js +14 -1
  33. package/lib/api/resource-types.api.js +107 -0
  34. package/lib/api/runtime-configuration.api.js +72 -0
  35. package/lib/api/types/resource-types.types.js +45 -0
  36. package/lib/api/user-groups.api.js +9 -9
  37. package/lib/api/users.api.js +8 -8
  38. package/lib/api/validation-runner.js +3 -1
  39. package/lib/api/wizard.api.js +10 -2
  40. package/lib/app/deploy-config.js +4 -1
  41. package/lib/app/down.js +78 -27
  42. package/lib/app/index.js +2 -2
  43. package/lib/app/push.js +4 -5
  44. package/lib/app/register.js +7 -4
  45. package/lib/app/run-env-compose.js +84 -30
  46. package/lib/app/run-resolve-image.js +2 -1
  47. package/lib/app/run-stop-containers.js +113 -0
  48. package/lib/app/run.js +1 -31
  49. package/lib/app/show-display.js +35 -0
  50. package/lib/app/show.js +32 -1
  51. package/lib/build/index.js +22 -5
  52. package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
  53. package/lib/certification/sync-system-certification.js +13 -6
  54. package/lib/channels/add-channel.js +348 -0
  55. package/lib/channels/channel-artifact-generator.js +141 -0
  56. package/lib/channels/channel-audit.js +101 -0
  57. package/lib/channels/channel-auth-context.js +37 -0
  58. package/lib/channels/channel-credential.js +200 -0
  59. package/lib/channels/channel-display-name.js +64 -0
  60. package/lib/channels/channel-external-system.js +106 -0
  61. package/lib/channels/channel-integration-generator.js +274 -0
  62. package/lib/channels/channel-probe.js +89 -0
  63. package/lib/channels/channel-runtime-resolver.js +152 -0
  64. package/lib/channels/channel-status-display.js +141 -0
  65. package/lib/channels/channel-targets.js +115 -0
  66. package/lib/cli/index.js +20 -4
  67. package/lib/cli/infra-guided-auth.js +109 -0
  68. package/lib/cli/infra-guided.js +84 -81
  69. package/lib/cli/setup-app.help.js +0 -31
  70. package/lib/cli/setup-app.js +82 -5
  71. package/lib/cli/setup-app.test-commands.js +5 -57
  72. package/lib/cli/setup-auth.js +25 -0
  73. package/lib/cli/setup-certification-commands.js +147 -0
  74. package/lib/cli/setup-certification.help.js +141 -0
  75. package/lib/cli/setup-environment.js +19 -2
  76. package/lib/cli/setup-external-system-help.js +62 -0
  77. package/lib/cli/setup-external-system.js +25 -3
  78. package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
  79. package/lib/cli/setup-infra-up-platform-action.js +2 -1
  80. package/lib/cli/setup-infra.js +9 -1
  81. package/lib/cli/setup-platform.js +6 -1
  82. package/lib/cli/setup-secrets.js +33 -1
  83. package/lib/cli/setup-utility-help-after.js +25 -2
  84. package/lib/cli/setup-utility-repair.js +198 -0
  85. package/lib/cli/setup-utility-resolve.js +44 -5
  86. package/lib/cli/setup-utility-validate.js +197 -0
  87. package/lib/cli/setup-utility.js +4 -239
  88. package/lib/commands/app-logs.js +54 -26
  89. package/lib/commands/app.js +41 -0
  90. package/lib/commands/auth-status-client-tokens.js +214 -0
  91. package/lib/commands/auth-status-dataplane-version.js +142 -68
  92. package/lib/commands/auth-status.js +43 -54
  93. package/lib/commands/channel.js +58 -0
  94. package/lib/commands/datasource-test-trust-cli.js +27 -23
  95. package/lib/commands/datasource-unified-test-cli.js +6 -3
  96. package/lib/commands/datasource-unified-test-cli.options.js +5 -1
  97. package/lib/commands/datasource.js +8 -8
  98. package/lib/commands/dev-show-display.js +8 -1
  99. package/lib/commands/governance-cli-shared.js +94 -0
  100. package/lib/commands/governance-command-action.js +132 -0
  101. package/lib/commands/governance-download-external.js +34 -0
  102. package/lib/commands/governance-generate-external.js +71 -0
  103. package/lib/commands/governance-upload-external.js +36 -0
  104. package/lib/commands/governance-verify-external.js +64 -0
  105. package/lib/commands/governance.js +144 -0
  106. package/lib/commands/identity-apply-sync.js +49 -8
  107. package/lib/commands/identity-group-cli.js +66 -26
  108. package/lib/commands/identity-membership-role-cache.js +58 -37
  109. package/lib/commands/identity-shared.js +22 -1
  110. package/lib/commands/identity-user-cli.js +80 -34
  111. package/lib/commands/lifecycle-command-action.js +123 -0
  112. package/lib/commands/lifecycle-external.js +268 -0
  113. package/lib/commands/login.js +11 -2
  114. package/lib/commands/repair-auth-apply.js +153 -0
  115. package/lib/commands/repair-auth-config.js +8 -13
  116. package/lib/commands/repair-changed-files.js +41 -0
  117. package/lib/commands/repair-datasource-com-v2.js +15 -0
  118. package/lib/commands/repair-datasource-keys.js +4 -1
  119. package/lib/commands/repair-datasource-run.js +59 -0
  120. package/lib/commands/repair-datasource-service-contract.js +206 -0
  121. package/lib/commands/repair-datasource-test-payload.js +259 -0
  122. package/lib/commands/repair-datasource.js +49 -64
  123. package/lib/commands/repair-env-template.js +76 -25
  124. package/lib/commands/repair-external-run.js +216 -0
  125. package/lib/commands/repair-openapi-sync.js +49 -4
  126. package/lib/commands/repair-persist.js +4 -0
  127. package/lib/commands/repair-rbac.js +52 -1
  128. package/lib/commands/repair-steps.js +160 -0
  129. package/lib/commands/repair-system-alignment.js +7 -4
  130. package/lib/commands/repair.js +29 -296
  131. package/lib/commands/resource-type.js +371 -0
  132. package/lib/commands/secrets-get.js +184 -0
  133. package/lib/commands/secrets-remove-all.js +3 -1
  134. package/lib/commands/setup-image-refresh.js +146 -0
  135. package/lib/commands/setup-modes.js +158 -162
  136. package/lib/commands/setup-platform-auth.js +76 -0
  137. package/lib/commands/setup-prompts-admin.js +244 -0
  138. package/lib/commands/setup-prompts-platform-mode.js +70 -0
  139. package/lib/commands/setup-prompts-validators.js +36 -0
  140. package/lib/commands/setup-prompts.js +24 -76
  141. package/lib/commands/setup-run-context.js +45 -0
  142. package/lib/commands/setup-spinners.js +39 -0
  143. package/lib/commands/setup.js +27 -5
  144. package/lib/commands/teardown.js +39 -0
  145. package/lib/commands/test-e2e-external.js +24 -8
  146. package/lib/commands/test-governance-external.js +3 -24
  147. package/lib/commands/test-trust-external.js +48 -100
  148. package/lib/commands/up-common.js +57 -13
  149. package/lib/commands/up-dataplane.js +56 -15
  150. package/lib/commands/upload-publish-context.js +75 -0
  151. package/lib/commands/upload-sidecar-followups.js +89 -0
  152. package/lib/commands/upload.js +113 -110
  153. package/lib/commands/verify-governance-combined-external.js +61 -0
  154. package/lib/commands/verify-governance-command-action.js +64 -0
  155. package/lib/commands/verify-governance-db.js +102 -0
  156. package/lib/commands/verify-governance-external.js +77 -0
  157. package/lib/commands/verify-governance-result-builders.js +71 -0
  158. package/lib/commands/verify-operations-command-action.js +68 -0
  159. package/lib/commands/verify-operations-external.js +268 -0
  160. package/lib/commands/verify-operations-persist.js +75 -0
  161. package/lib/commands/verify-operations-step-plan.js +68 -0
  162. package/lib/commands/verify-operations-steps.js +111 -0
  163. package/lib/commands/verify-trust-command-action.js +73 -0
  164. package/lib/commands/verify-trust-external.js +59 -0
  165. package/lib/commands/wizard-config-normalizer.js +43 -23
  166. package/lib/commands/wizard-core.js +2 -0
  167. package/lib/core/admin-password-generator.js +38 -0
  168. package/lib/core/admin-secrets-bundle.js +111 -0
  169. package/lib/core/admin-secrets-env-overlay.js +62 -0
  170. package/lib/core/admin-secrets.js +32 -4
  171. package/lib/core/config-attach-extensions.js +3 -0
  172. package/lib/core/config-platform-controller.js +44 -0
  173. package/lib/core/config-setup-installation-profile.js +42 -0
  174. package/lib/core/config-setup-platform-mode.js +46 -0
  175. package/lib/core/config.js +46 -36
  176. package/lib/core/secrets-admin-env.js +6 -2
  177. package/lib/core/secrets-ensure.js +4 -0
  178. package/lib/core/secrets-env-content.js +54 -48
  179. package/lib/core/secrets-env-write.js +10 -1
  180. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  181. package/lib/core/setup-installation-profile.js +43 -0
  182. package/lib/core/setup-platform-mode.js +90 -0
  183. package/lib/datasource/agent-trust-debug-log.js +1 -1
  184. package/lib/datasource/agent-trust-run.js +5 -3
  185. package/lib/datasource/audit-evidence-extract-debug.js +30 -18
  186. package/lib/datasource/audit-evidence-extract.js +7 -4
  187. package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
  188. package/lib/datasource/bulk-loader-run-batches.js +15 -3
  189. package/lib/datasource/capability/capability-diff-slice.js +2 -2
  190. package/lib/datasource/capability/capability-manifest.js +254 -0
  191. package/lib/datasource/capability/capability-resolve.js +3 -4
  192. package/lib/datasource/capability/copy-operations.js +5 -3
  193. package/lib/datasource/capability/remove-operations.js +2 -1
  194. package/lib/datasource/capability/run-capability-copy.js +32 -4
  195. package/lib/datasource/capability/run-capability-diff.js +3 -3
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -4
  197. package/lib/datasource/capability/run-capability-edit.js +4 -7
  198. package/lib/datasource/capability/run-capability-relate.js +2 -4
  199. package/lib/datasource/capability/run-capability-remove.js +2 -4
  200. package/lib/datasource/capability/validate-capability-slice.js +2 -1
  201. package/lib/datasource/datasource-identifier.js +2 -1
  202. package/lib/datasource/datasource-load-export-context.js +3 -0
  203. package/lib/datasource/datasource-validate-display.js +1 -1
  204. package/lib/datasource/field-reference-validator.js +24 -3
  205. package/lib/datasource/log-cleaner.js +2 -2
  206. package/lib/datasource/log-viewer.js +8 -8
  207. package/lib/datasource/orphan-profiles-validator.js +98 -0
  208. package/lib/datasource/test-e2e.js +4 -1
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run.js +5 -2
  211. package/lib/datasource/validate.js +41 -23
  212. package/lib/deployment/environment-poll-status.js +138 -0
  213. package/lib/deployment/environment.js +42 -34
  214. package/lib/external-system/download-helpers.js +87 -0
  215. package/lib/external-system/download.js +78 -138
  216. package/lib/external-system/generator.js +1 -55
  217. package/lib/external-system/integration-auth-context.js +45 -0
  218. package/lib/external-system/test-auth.js +12 -5
  219. package/lib/external-system/test.js +16 -21
  220. package/lib/generator/builders.js +11 -1
  221. package/lib/generator/external-controller-manifest.js +18 -0
  222. package/lib/generator/split.js +3 -1
  223. package/lib/generator/wizard.js +1 -28
  224. package/lib/governance/governance-cli-errors.js +96 -0
  225. package/lib/governance/governance-download-display.js +38 -0
  226. package/lib/governance/governance-run-display.js +215 -25
  227. package/lib/identity/fk-reference.js +65 -0
  228. package/lib/identity/identity-apply-core.js +13 -58
  229. package/lib/identity/identity-apply-phases.js +5 -1
  230. package/lib/identity/identity-display.js +243 -0
  231. package/lib/identity/identity-response-helpers.js +52 -0
  232. package/lib/identity/identity-sync-errors.js +62 -0
  233. package/lib/identity/resolve-user-id.js +129 -0
  234. package/lib/identity/username-default.js +31 -0
  235. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  236. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  237. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  238. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  239. package/lib/infrastructure/helpers.js +23 -129
  240. package/lib/infrastructure/index.js +5 -6
  241. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  242. package/lib/lifecycle/certification-progress.js +231 -0
  243. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  244. package/lib/lifecycle/exit-codes.js +24 -0
  245. package/lib/lifecycle/json-envelope.js +25 -0
  246. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  247. package/lib/lifecycle/logger-quiet.js +29 -0
  248. package/lib/lifecycle/open-api-published.js +59 -0
  249. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  250. package/lib/lifecycle/product-model.js +196 -0
  251. package/lib/lifecycle/report-display-trust.js +70 -0
  252. package/lib/lifecycle/report-display.js +472 -0
  253. package/lib/lifecycle/scenario-upload.js +191 -0
  254. package/lib/lifecycle/verify-step-progress.js +87 -0
  255. package/lib/parameters/infra-kv-discovery.js +27 -2
  256. package/lib/protection/auth-context.js +10 -4
  257. package/lib/resolvers/datasource-resolver.js +2 -3
  258. package/lib/resolvers/resource-type-file.js +159 -0
  259. package/lib/schema/application-schema.json +17 -1
  260. package/lib/schema/datasource-test-run.schema.json +89 -6
  261. package/lib/schema/deployment-rules.yaml +2 -1
  262. package/lib/schema/external-datasource.schema.json +2947 -2619
  263. package/lib/schema/external-system.schema.json +1418 -761
  264. package/lib/schema/infra.parameter.yaml +45 -0
  265. package/lib/schema/type/credential-field-registry.json +103 -97
  266. package/lib/schema/type/document-storage.json +9 -5
  267. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  268. package/lib/utils/api.js +55 -31
  269. package/lib/utils/app-relative-path-env.js +112 -0
  270. package/lib/utils/app-run-containers.js +25 -2
  271. package/lib/utils/authentication-shape.js +224 -0
  272. package/lib/utils/build-copy.js +36 -5
  273. package/lib/utils/build-resolve-image.js +66 -12
  274. package/lib/utils/celery-companion-apps.js +53 -0
  275. package/lib/utils/cli-secrets-error-format.js +83 -21
  276. package/lib/utils/cli-utils.js +20 -4
  277. package/lib/utils/compose-celery-worker.js +23 -0
  278. package/lib/utils/compose-generate-docker-compose.js +13 -1
  279. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  280. package/lib/utils/config-secrets-path.js +46 -0
  281. package/lib/utils/configuration-env-resolver.js +36 -0
  282. package/lib/utils/controller-url.js +88 -1
  283. package/lib/utils/credential-secrets-env-kv.js +216 -0
  284. package/lib/utils/credential-secrets-env.js +175 -257
  285. package/lib/utils/dataplane-resolver.js +18 -2
  286. package/lib/utils/declarative-url-ports.js +27 -4
  287. package/lib/utils/deployment-auth-mode.js +41 -0
  288. package/lib/utils/developer-volume-id.js +33 -0
  289. package/lib/utils/docker-build.js +1 -4
  290. package/lib/utils/env-copy.js +14 -9
  291. package/lib/utils/env-kv-orphan-lines.js +43 -0
  292. package/lib/utils/error-formatters/network-errors.js +13 -4
  293. package/lib/utils/external-env-template.js +11 -3
  294. package/lib/utils/external-system-readiness-core.js +10 -0
  295. package/lib/utils/external-system-readiness-display.js +80 -23
  296. package/lib/utils/external-system-validators.js +8 -2
  297. package/lib/utils/health-check.js +4 -1
  298. package/lib/utils/help-builder.js +13 -8
  299. package/lib/utils/keycloak-realm-ready.js +101 -0
  300. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  301. package/lib/utils/manifest-source-emit.js +2 -0
  302. package/lib/utils/paths.js +25 -0
  303. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  304. package/lib/utils/platform-controller-url.js +157 -0
  305. package/lib/utils/platform-kv-ref.js +57 -0
  306. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  307. package/lib/utils/postgres-wipe.js +9 -2
  308. package/lib/utils/resolve-env-mode.js +47 -0
  309. package/lib/utils/runtime-configuration-download.js +189 -0
  310. package/lib/utils/runtime-configuration-values.js +119 -0
  311. package/lib/utils/schema-loader.js +19 -4
  312. package/lib/utils/secrets-generator.js +31 -25
  313. package/lib/utils/secrets-missing-error.js +164 -0
  314. package/lib/utils/service-url-label.js +81 -0
  315. package/lib/utils/setup-quiet-output.js +25 -0
  316. package/lib/utils/template-helpers.js +15 -0
  317. package/lib/utils/token-manager-client-credentials.js +201 -0
  318. package/lib/utils/token-manager-messages.js +8 -0
  319. package/lib/utils/token-manager-refresh.js +12 -2
  320. package/lib/utils/token-manager.js +86 -105
  321. package/lib/utils/upload-pipeline-ui.js +12 -5
  322. package/lib/utils/upload-sync-options.js +42 -0
  323. package/lib/utils/url-declarative-public-base.js +21 -3
  324. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  325. package/lib/utils/validation-poll-ui.js +8 -0
  326. package/lib/utils/validation-run-stage.js +45 -0
  327. package/lib/utils/worker-sidecars.js +142 -0
  328. package/lib/validation/external-manifest-validator.js +2 -0
  329. package/lib/validation/runtime-configuration-rules.js +98 -0
  330. package/lib/validation/validate-display-dimensions.js +154 -0
  331. package/lib/validation/validate-display-sections.js +276 -0
  332. package/lib/validation/validate-display-steps.js +67 -0
  333. package/lib/validation/validate-display.js +24 -402
  334. package/package.json +1 -1
  335. package/templates/applications/dataplane/application.yaml +7 -1
  336. package/templates/applications/dataplane/env.template +50 -14
  337. package/templates/applications/dataplane/rbac.yaml +108 -1
  338. package/templates/applications/miso-controller/application.yaml +2 -2
  339. package/templates/applications/miso-controller/env.template +53 -122
  340. package/templates/applications/miso-controller/rbac.yaml +28 -13
  341. package/templates/channels/chatgpt/install.template.md.hbs +49 -0
  342. package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
  343. package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
  344. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
  345. package/templates/channels/slack/install.template.md.hbs +49 -0
  346. package/templates/channels/slack/manifest.template.json.hbs +66 -0
  347. package/templates/channels/teams-bot/install.template.md.hbs +49 -0
  348. package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
  349. package/templates/channels/web-embed/install.template.md.hbs +49 -0
  350. package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
  351. package/templates/external-system/README.md.hbs +74 -17
  352. package/templates/python/docker-compose.hbs +75 -18
  353. package/templates/typescript/docker-compose.hbs +70 -17
  354. package/lib/commands/test-governance-command-action.js +0 -55
  355. package/lib/commands/test-trust-command-action.js +0 -118
@@ -7,6 +7,8 @@ alwaysApply: false
7
7
 
8
8
  When you touch **CLI surface** (`bin/aifabrix.js`, `lib/cli.js`, `lib/cli/**`, `lib/commands/**`) or **shared CLI formatters**, you must keep behavior aligned with the canonical docs in this folder.
9
9
 
10
+ **Product-neutral copy:** User-facing help, errors, and warnings must not reference internal plan IDs or hardcode lab-only integration names in generic code. See [cli-product-neutral.mdc](./cli-product-neutral.mdc).
11
+
10
12
  ## Sources of truth (read before shipping)
11
13
 
12
14
  | Document | Role |
@@ -0,0 +1,43 @@
1
+ ---
2
+ description: Apply when changing aifabrix CLI code, help text, errors, or user-facing docs under docs/commands. Keeps product output free of internal plans, training labs, and hardcoded integration names.
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # CLI product-neutral output (Builder)
7
+
8
+ The **aifabrix** CLI is a **product**. User-visible strings must not encode internal engineering artifacts.
9
+
10
+ ## Forbidden in product paths
11
+
12
+ Applies to **`lib/cli/**`**, **`lib/commands/**`**, CLI help (Commander `.description()` / `.option()` / `addHelpText`), **`lib/utils/*-error*.js`**, terminal messages from **`lib/utils/cli-*`**, and **`docs/commands/**`** (see [docs-rules.mdc](./docs-rules.mdc)).
13
+
14
+ | Do not use | Use instead |
15
+ | ---------- | ----------- |
16
+ | Internal plan IDs (`Plan 331`, `plan 148`, `BK-1`) | User terms: *active datasource schema guards*, *schema replacement*, *overlap* |
17
+ | Training / lab-only system keys baked into `if` branches (`sharepoint-e2e`, `hubspot-demo` in runtime logic) | **Dynamic** behavior from `systemKey`, `appName`, manifest, env.template, or secrets map |
18
+ | Hardcoded vendor or connector names in generic helpers | Generic rules (path suffix, namespace, configuration keys from disk) |
19
+ | Cursor plan file paths in errors or help | Link only in `.cursor/plans/` and contributor docs |
20
+
21
+ **Examples in docs/commands** may name real apps (`hubspot-e2e`) when illustrating a command; **library code** must not special-case those names unless the user passed them as arguments.
22
+
23
+ ## Required patterns
24
+
25
+ - **Missing `kv://` secrets:** Compare requested paths to the loaded secrets map generically (e.g. same path segment under a different namespace). Never hardcode `sharepoint` / `sharepoint-e2e` (or any other lab pair) in `lib/`.
26
+ - **`--force` messaging:** Describe dataplane behavior (*bypass active-datasource schema replacement guards*), not internal plan numbers. Do **not** append extra CLI hints by matching English substrings on API errors — the dataplane pipeline already returns remediation in the 400 body when schema replacement is blocked.
27
+ - **No `upload-pipeline-error-hints`-style modules:** Prefer forwarding `formatApiError` output; optional hints belong in the API contract, not duplicated heuristics in the CLI.
28
+ - **Auth / pipeline errors:** Describe what the user can do (`aifabrix login`, `AIFABRIX_DEPLOYMENT_AUTH=client-credentials`), not ticket or plan IDs.
29
+ - **JSDoc `@fileoverview`:** No plan numbers; optional brief behavior description only.
30
+
31
+ ## Verification
32
+
33
+ Before merging CLI UX changes:
34
+
35
+ 1. `rg -i 'plan [0-9]|BK-[0-9]|sharepoint-e2e' lib/cli lib/commands lib/utils --glob '*.js'` → no matches in generic helpers (fixture strings in tests are OK).
36
+ 2. New error hints must work for **any** integration folder name the user owns.
37
+ 3. [cli-layout.mdc](./cli-layout.mdc) and [docs-rules.mdc](./docs-rules.mdc) still apply for glyphs and user-doc scope.
38
+
39
+ ## Related
40
+
41
+ - [cli-layout.mdc](./cli-layout.mdc) — terminal layout and output profiles
42
+ - [docs-rules.mdc](./docs-rules.mdc) — public CLI documentation audience
43
+ - [project-rules.mdc](./project-rules.mdc) — ISO / security baseline
@@ -894,6 +894,7 @@ Define request/response types using JSDoc `@typedef`:
894
894
 
895
895
  ### Must Not Do (❌)
896
896
  - ❌ Never hardcode secrets, passwords, or tokens
897
+ - ❌ Never hardcode lab/training integration names, vendor names, or internal plan IDs in generic CLI/helpers (`lib/commands/**`, `lib/cli/**`, shared `lib/utils/*-error*.js`); use dynamic keys from user input, manifests, and secrets — see [cli-product-neutral.mdc](cli-product-neutral.mdc)
897
898
  - ❌ Never expose sensitive data in error messages
898
899
  - ❌ Never use synchronous file operations in async functions (unless necessary)
899
900
  - ❌ Never ignore errors or use empty catch blocks
package/.npmrc.token ADDED
@@ -0,0 +1 @@
1
+ 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
@@ -0,0 +1 @@
1
+ {"apiVersion":"dataplane.aifabrix.ai/v1","kind":"Protection","metadata":{"key":"hubspot-country-sales","displayName":"HubSpot Country Sales Access"},"spec":{"enabled":true,"datasourceKey":"hubspot-companies","mode":"replaceForSource","rules":[{"key":"sales-country-users","principal":{"type":"group","expression":"Sales {{fk.country.metadata.iso3}} Users"},"grants":[{"dimensionKey":"country","valueExpression":"{{fk.country.metadata.iso2}}"}]}]}}
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1 @@
1
+ {"apiVersion":"dataplane.aifabrix.ai/v1","kind":"Protection","metadata":{"key":"hubspot-country-sales","displayName":"HubSpot Country Sales Access"},"spec":{"enabled":true,"datasourceKey":"hubspot-companies","mode":"replaceForSource","rules":[{"key":"sales-country-users","principal":{"type":"group","expression":"Sales {{fk.country.metadata.iso3}} Users"},"grants":[{"dimensionKey":"country","valueExpression":"{{fk.country.metadata.iso2}}"}]}]}}
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1,17 @@
1
+ apiVersion: dataplane.aifabrix.ai/v1
2
+ kind: Protection
3
+ metadata:
4
+ key: hubspot-country-sales
5
+ displayName: HubSpot Country Sales Access
6
+ spec:
7
+ enabled: true
8
+ datasourceKey: hubspot-companies
9
+ mode: replaceForSource
10
+ rules:
11
+ - key: sales-country-users
12
+ principal:
13
+ type: group
14
+ expression: "Sales {{fk.country.metadata.iso3}} Users"
15
+ grants:
16
+ - dimensionKey: country
17
+ valueExpression: "{{fk.country.metadata.iso2}}"
@@ -0,0 +1,5 @@
1
+ lint:fix exit=0
2
+ lint exit=0
3
+ test exit=0
4
+ miso typecheck exit=0
5
+ miso build exit=0
package/README.md CHANGED
@@ -23,12 +23,12 @@ Open developer runtime for AI Fabrix ecosystem. Install the AI Fabrix platform a
23
23
  ## Prerequisites
24
24
 
25
25
  - **Node.js 18+** – Recommended for running the CLI.
26
- - **AI Fabrix Azure / platform:** Install from **Azure Marketplace** or run via **Docker** (e.g. `aifabrix up-platform`). You need **full access to Docker** (docker commands) where applicable.
27
- - **Secrets before platform:** Add secrets (e.g. OpenAI or Azure OpenAI) **before** running `aifabrix up-platform`; the platform reads them from the place you configure. See [Infrastructure](docs/infrastructure.md) and secrets configuration.
26
+ - **Docker Desktop** – Full access to Docker (containers for infra and platform).
27
+ - **Secrets before platform:** Add an AI tool key (OpenAI or Azure OpenAI) in setup or with `aifabrix secret set` **before** the platform needs them. See [Infrastructure](docs/infrastructure.md).
28
28
 
29
29
  ---
30
30
 
31
- ## Install
31
+ ## Install the CLI
32
32
 
33
33
  ```bash
34
34
  npm install -g @aifabrix/builder
@@ -38,33 +38,59 @@ npm install -g @aifabrix/builder
38
38
 
39
39
  ---
40
40
 
41
- ## Goal 1: Start and test the AI Fabrix platform
41
+ ## Goal 1: Install the platform (one command)
42
42
 
43
- Get the platform running locally so you can try it.
44
-
45
- **One-shot install:**
43
+ Get Postgres, Redis, Keycloak, Miso Controller, and Dataplane running on your machine.
46
44
 
47
45
  ```bash
48
46
  aifabrix setup
49
47
  ```
50
48
 
51
- `aifabrix setup` detects your local state and either runs a fresh-install wizard (admin email/password, optional AI tool keys) or shows a mode menu (re-install, wipe data, clean files, update images). It then runs `up-infra` and `up-platform` for you. Use `aifabrix teardown` to fully remove the local installation. See [Infrastructure commands](docs/commands/infrastructure.md#aifabrix-setup) for details and CI flags.
49
+ That is the whole story for most developers. The command detects whether infra is already running:
50
+
51
+ | Situation | What happens |
52
+ | --- | --- |
53
+ | **Fresh machine** | Short wizard → pull images → `up-infra` → `up-platform` |
54
+ | **Already installed** | Mode menu (3 choices): **re-install** (destroys volumes), **wipe data** (DBs only), or **update images** (keeps data) — each path pulls fresh Docker images before restart |
55
+
56
+ **Grab a coffee** — setup pulls infrastructure and platform images (a few minutes on first run or after image updates). When setup finishes, the CLI stores **`platform-controller`** in `config.yaml` (absolute Miso URL for your machine). Sign in with username **`admin`** and your admin password. If you were already logged in to that controller URL, setup keeps your session; otherwise it prompts for device login like a fresh install.
57
+
58
+ **Controller URL:** Local Docker without Traefik uses `http://localhost:` + port `3000 + developerId×100`. With Traefik and `remote-server`, use the public URL shown in the **Platform Ready** footer (path `/miso/*`). See [Infrastructure guide](docs/infrastructure.md#install-the-platform-one-command).
59
+
60
+ → Step-by-step detail, ports, and **dev / pro** installation profiles: **[Infrastructure guide](docs/infrastructure.md#install-the-platform-one-command)**
61
+
62
+ ### Dev vs pro installation (setup profile)
63
+
64
+ These names match how we talk about **environments** elsewhere (**dev**, **tst**, **pro**). Here they mean **how you install locally**, not which cloud environment you deploy to later.
65
+
66
+ | Profile | Best for | Admin email | Admin passwords |
67
+ | --- | --- | --- | --- |
68
+ | **dev** (default) | Local development, training, labs | You enter once | **One password** for Postgres, pgAdmin, Keycloak, and platform login |
69
+ | **pro** | Production-style or hardened installs | Same | **Autogenerate** strong passwords (shown once) **or** enter manually |
52
70
 
53
- If you prefer to set the AI tool key outside the wizard, use one of:
71
+ **Default:** **dev** (one email, one password). **Pro** is available in the setup wizard or non-interactively:
54
72
 
55
- - **OpenAI:** set your API key:
73
+ ```bash
74
+ aifabrix setup --installation pro --pro-password-mode autogen
75
+ ```
76
+
77
+ Use `--pro-password-mode manual` to enter passwords yourself (one password for all roles, or separate infra / Keycloak / platform passwords via `up-infra` flags).
78
+
79
+ Admin credentials are stored in **`~/.aifabrix/admin-secrets.env`** (encrypted when you configure a secrets encryption key). App and integration secrets stay in **`~/.aifabrix/secrets.local.yaml`**.
80
+
81
+ ### Optional: set AI keys outside the wizard
82
+
83
+ - **OpenAI:**
56
84
  ```bash
57
85
  aifabrix secret set secrets-openaiApiKeyVault <your-openai-secret-key>
58
86
  ```
59
- - **Azure OpenAI:** set endpoint and API key:
87
+ - **Azure OpenAI:**
60
88
  ```bash
61
89
  aifabrix secret set azure-openaiapi-urlKeyVault <your-azure-openai-endpoint-url>
62
90
  aifabrix secret set secrets-azureOpenaiApiKeyVault <your-azure-openai-secret-key>
63
91
  ```
64
92
 
65
- Secrets are stored in `~/.aifabrix/secrets.local.yaml` or the file from `aifabrix-secrets` in your config (e.g. `builder/secrets.local.yaml`).
66
-
67
- → [Infrastructure guide](docs/infrastructure.md)
93
+ Remove the platform completely: `aifabrix teardown`. Command details: [Infrastructure commands](docs/commands/infrastructure.md#aifabrix-setup).
68
94
 
69
95
  ---
70
96
 
@@ -72,7 +98,7 @@ Secrets are stored in `~/.aifabrix/secrets.local.yaml` or the file from `aifabri
72
98
 
73
99
  Create and deploy an external system (e.g. HubSpot): wizard or manual setup, then validate and deploy.
74
100
 
75
- **Example: HubSpot**
101
+ **Example: HubSpot:**
76
102
 
77
103
  - Create: `aifabrix create hubspot-test` (external is the default; or `aifabrix wizard` for guided setup). For a web app use `aifabrix create my-app --type webapp`.
78
104
  - Configure auth and datasources under `integration/hubspot-test/`.
@@ -96,7 +122,7 @@ Create, configure, and run your own AI Fabrix application locally or deploy it (
96
122
  All guides and references are listed in **[docs/README.md](docs/README.md)** (table of contents).
97
123
 
98
124
  - [CLI Commands Reference](docs/commands/README.md) – All commands
99
- - [Infrastructure](docs/infrastructure.md) – What runs and why
125
+ - [Infrastructure](docs/infrastructure.md) – Install the platform, services, dev/pro setup
100
126
  - [Configuration reference](docs/configuration/README.md) – Config files (deployment key, application.yaml, env.template, secrets)
101
127
 
102
128
  ---
@@ -111,6 +137,6 @@ All guides and references are listed in **[docs/README.md](docs/README.md)** (ta
111
137
 
112
138
  ## License
113
139
 
114
- © eSystems Nordic Ltd 2025 - All Rights Reserved
140
+ © eSystems Nordic Ltd 2026 - All Rights Reserved
115
141
 
116
142
  `@aifabrix/builder` is part of the AI Fabrix platform.
@@ -2,7 +2,7 @@ appName: wizard-e2e-credential-real
2
2
  mode: create-system
3
3
  source:
4
4
  type: openapi-file
5
- filePath: ./integration/hubspot-test/companies.json
5
+ filePath: /workspace/aifabrix-builder/integration/hubspot-test/companies.json
6
6
  credential:
7
7
  action: create
8
8
  config:
@@ -2,7 +2,7 @@ appName: wizard-e2e-env-vars
2
2
  mode: create-system
3
3
  source:
4
4
  type: openapi-file
5
- filePath: ./integration/hubspot-test/companies.json
5
+ filePath: /workspace/aifabrix-builder/integration/hubspot-test/companies.json
6
6
  deployment:
7
7
  controller: ${CONTROLLER_URL}
8
8
  dataplane: ${DATAPLANE_URL}
@@ -3,8 +3,9 @@
3
3
  * @fileoverview
4
4
  */
5
5
 
6
- const { defaultProject } = require('./jest.projects');
6
+ const { defaultProject, globalLiveFabrixHooks } = require('./jest.projects');
7
7
 
8
8
  module.exports = {
9
+ ...globalLiveFabrixHooks,
9
10
  projects: [defaultProject]
10
11
  };
@@ -3,8 +3,9 @@
3
3
  * @fileoverview
4
4
  */
5
5
 
6
- const { isolatedProjects } = require('./jest.projects');
6
+ const { isolatedProjects, globalLiveFabrixHooks } = require('./jest.projects');
7
7
 
8
8
  module.exports = {
9
+ ...globalLiveFabrixHooks,
9
10
  projects: isolatedProjects
10
11
  };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Global Jest hooks and CI guard project for live ~/.aifabrix protection.
3
+ * @fileoverview
4
+ */
5
+
6
+ /** Once per Jest process — protects live ~/.aifabrix (incl. /workspace/.aifabrix). */
7
+ const globalLiveFabrixHooks = {
8
+ globalSetup: '<rootDir>/tests/global-live-fabrix-backup.js',
9
+ globalTeardown: '<rootDir>/tests/global-live-fabrix-backup.js'
10
+ };
11
+
12
+ /**
13
+ * @param {object} opts - CI flag and Babel transform config from jest.projects.js
14
+ * @param {boolean} opts.isCI - Whether CI or CI simulation is active
15
+ * @param {object} opts.sharedTransform - Shared babel-jest transform map
16
+ * @returns {object} Jest project configuration
17
+ */
18
+ function createSetupCiLiveFabrixGuardProject({ isCI, sharedTransform }) {
19
+ return {
20
+ displayName: 'setup-ci-live-fabrix-guard',
21
+ testEnvironment: 'node',
22
+ transform: sharedTransform,
23
+ testMatch: ['**/tests/setup-ci-live-fabrix-guard.test.js'],
24
+ testPathIgnorePatterns: ['/node_modules/', '\\\\node_modules\\\\'],
25
+ setupFiles: ['<rootDir>/tests/capture-real-fs.js', '<rootDir>/tests/setup-ci-env.js'],
26
+ setupFilesAfterEnv: ['<rootDir>/tests/setup.js'],
27
+ testTimeout: isCI ? 15000 : 8000,
28
+ maxWorkers: 1,
29
+ ...globalLiveFabrixHooks
30
+ };
31
+ }
32
+
33
+ module.exports = {
34
+ globalLiveFabrixHooks,
35
+ createSetupCiLiveFabrixGuardProject
36
+ };
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Jest isolated project list (separate process per suite when run via jest.config.isolated.js).
3
+ * @fileoverview
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const { createSetupCiLiveFabrixGuardProject } = require('./jest.global-live-fabrix-hooks');
9
+
10
+ /** @type {[string, string[]][]} displayName and testMatch globs */
11
+ const ISOLATED_SUITE_ENTRIES = [
12
+ ['cli-utils', ['**/tests/lib/utils/cli-utils.test.js']],
13
+ ['external-system-display', ['**/tests/lib/utils/external-system-display.test.js']],
14
+ ['dev-hosts-helper', ['**/tests/lib/utils/dev-hosts-helper.test.js']],
15
+ ['parameters-validate', ['**/tests/lib/commands/parameters-validate.test.js']],
16
+ ['test-e2e-external', ['**/tests/lib/commands/test-e2e-external.test.js']],
17
+ ['repair-openapi-sync', ['**/tests/lib/commands/repair-openapi-sync.test.js']],
18
+ ['paths-app-listing', ['**/tests/lib/utils/paths-app-listing.test.js']],
19
+ ['paths-system-builder-resolution', ['**/tests/lib/utils/paths-system-builder-resolution.test.js']],
20
+ ['manifest-location', ['**/tests/lib/utils/manifest-location.test.js']],
21
+ ['installation-log', ['**/tests/lib/utils/installation-log.test.js']],
22
+ ['secrets-ancestor-paths', ['**/tests/lib/utils/secrets-ancestor-paths.test.js']],
23
+ ['datasource-validation-watch', ['**/tests/lib/utils/datasource-validation-watch.test.js']],
24
+ [
25
+ 'log-viewer',
26
+ [
27
+ '**/tests/lib/datasource/log-viewer.test.js',
28
+ '**/tests/lib/datasource/log-viewer-structural.test.js',
29
+ '**/tests/lib/datasource/log-viewer-run.test.js'
30
+ ]
31
+ ],
32
+ ['audit-evidence-extract', ['**/tests/lib/datasource/audit-evidence-extract.test.js']],
33
+ ['manifest-source-emit', ['**/tests/lib/utils/manifest-source-emit.test.js']],
34
+ ['register-aifabrix-shell-env', ['**/tests/lib/utils/register-aifabrix-shell-env.test.js']],
35
+ ['datasource-test-run-schema-sync', ['**/tests/lib/utils/datasource-test-run-schema-sync.test.js']],
36
+ ['infra-platform-contract', ['**/tests/lib/parameters/infra-platform-contract.test.js']],
37
+ [
38
+ 'application-frontdoor-paths-contract',
39
+ ['**/tests/lib/templates/application-frontdoor-paths.contract.test.js']
40
+ ],
41
+ ['database-secret-values', ['**/tests/lib/parameters/database-secret-values.test.js']],
42
+ ['infra-parameter-validate', ['**/tests/lib/parameters/infra-parameter-validate.test.js']],
43
+ [
44
+ 'infra-parameter-catalog',
45
+ [
46
+ '**/tests/lib/parameters/infra-parameter-catalog.test.js',
47
+ '**/tests/lib/utils/platform-kv-ref.test.js'
48
+ ]
49
+ ],
50
+ ['urls-local-registry', ['**/tests/lib/utils/urls-local-registry.test.js']],
51
+ ['aifabrix-runtime-config-dir', ['**/tests/lib/utils/aifabrix-runtime-config-dir.test.js']],
52
+ ['platform-env-template-kv-catalog', ['**/tests/lib/parameters/platform-env-template-kv-catalog.test.js']],
53
+ ['resolve-infra-state-paths', ['**/tests/lib/infrastructure/resolve-infra-state-paths.test.js']],
54
+ ['dev-ssh-config-helper', ['**/tests/lib/utils/dev-ssh-config-helper.test.js']],
55
+ ['ssh-key-helper', ['**/tests/lib/utils/ssh-key-helper.test.js']],
56
+ ['secrets-ensure-catalog-fallback', ['**/tests/lib/core/secrets-ensure-catalog-fallback.test.js']],
57
+ ['secrets-ensure', ['**/tests/lib/core/secrets-ensure.test.js']],
58
+ ['url-declarative-vdir-inactive-env', ['**/tests/lib/utils/url-declarative-vdir-inactive-env.test.js']],
59
+ [
60
+ 'url-declarative-user-cfg-per-app-proxy',
61
+ ['**/tests/lib/utils/url-declarative-user-cfg-per-app-proxy.test.js']
62
+ ],
63
+ [
64
+ 'declarative-url-paths-spy-suites',
65
+ [
66
+ '**/tests/lib/utils/url-declarative-expand-traefik-off-no-usercfg.test.js',
67
+ '**/tests/lib/core/secrets-env-declarative-show-urls.test.js',
68
+ '**/tests/lib/utils/url-declarative-registry-internal-docker-origin.test.js'
69
+ ]
70
+ ],
71
+ ['platform-urls-registry-validation', ['**/tests/lib/commands/platform-urls-registry.validation.test.js']],
72
+ ['env-copy-resolve-output', ['**/tests/lib/utils/env-copy-resolve-output.test.js']],
73
+ ['write-env-output-reload', ['**/tests/lib/utils/write-env-output-reload.test.js']],
74
+ ['app-service-env-from-builder', ['**/tests/lib/utils/app-service-env-from-builder.test.js']],
75
+ ['infra-kv-discovery', ['**/tests/lib/parameters/infra-kv-discovery.test.js']],
76
+ ['infra-env-defaults', ['**/tests/lib/utils/infra-env-defaults.test.js']],
77
+ ['compose-traefik-template', ['**/tests/lib/infrastructure/compose-traefik-template.test.js']],
78
+ ['generator-external-rbac', ['**/tests/lib/generator/generator-external-rbac.test.js']],
79
+ ['helpers-ensure-admin-secrets', ['**/tests/lib/infrastructure/helpers-ensure-admin-secrets.test.js']],
80
+ ['secrets-generator', ['**/tests/lib/utils/secrets-generator.test.js']],
81
+ ['ensure-dev-certs-for-remote-docker', ['**/tests/lib/utils/ensure-dev-certs-for-remote-docker.test.js']],
82
+ ['generator-error-paths', ['**/tests/lib/generator/generator-error-paths.test.js']],
83
+ ['generator-validation', ['**/tests/lib/generator/generator-validation.test.js']],
84
+ ['secrets-databaselog', ['**/tests/lib/core/secrets-databaselog.test.js']],
85
+ ['schema-241-alignment', ['**/tests/lib/validation/schema-241-alignment.test.js']],
86
+ ['hubspot-e2e-com-v2', ['**/tests/lib/validation/hubspot-e2e-com-v2.test.js']],
87
+ ['runtime-configuration-download', ['**/tests/lib/utils/runtime-configuration-download.test.js']],
88
+ ['schema-resolver-order', ['**/tests/lib/utils/schema-resolver-order.test.js']],
89
+ ['app-module', ['**/tests/lib/app/app.test.js']],
90
+ ['admin-secrets', ['**/tests/lib/core/admin-secrets.test.js']],
91
+ ['validate-datasource-parsed', ['**/tests/lib/datasource/validate-datasource-parsed.test.js']],
92
+ [
93
+ 'capability-run-real-fs',
94
+ [
95
+ '**/tests/lib/datasource/run-capability-copy.test.js',
96
+ '**/tests/lib/datasource/run-capability-diff.test.js',
97
+ '**/tests/lib/datasource/run-capability-edit.test.js',
98
+ '**/tests/lib/datasource/run-capability-remove.test.js'
99
+ ]
100
+ ],
101
+ ['log-cleaner', ['**/tests/lib/datasource/log-cleaner.test.js']],
102
+ ['datasource-exporter-service', ['**/tests/lib/datasource/datasource-exporter-service.test.js']],
103
+ ['protection-paths', ['**/tests/lib/protection/paths.test.js']],
104
+ ['protection-resolve', ['**/tests/lib/protection/protection-resolve.test.js']],
105
+ ['protection-create-helpers', ['**/tests/lib/protection/run-protection-create-helpers.test.js']],
106
+ [
107
+ 'governance-pack-loader',
108
+ [
109
+ '**/tests/lib/governance/governance-pack-loader.test.js',
110
+ '**/tests/lib/lifecycle/scenario-upload.test.js'
111
+ ]
112
+ ],
113
+ [
114
+ 'governance-generate-external',
115
+ ['**/tests/lib/commands/governance-generate-external.test.js']
116
+ ],
117
+ ['protection-validate-batch', ['**/tests/lib/protection/validate-batch.test.js']],
118
+ ['aifabrix-runtime-sandbox', ['**/tests/helpers/aifabrix-runtime-sandbox.test.js']],
119
+ ['aifabrix-runtime-backup', ['**/tests/helpers/aifabrix-runtime-backup.test.js']],
120
+ ['paths-jest-sandbox-integration', ['**/tests/lib/utils/paths-jest-sandbox-integration.test.js']],
121
+ ['secrets-remove-all-guard', ['**/tests/lib/commands/secrets-remove-all-guard.test.js']],
122
+ ['app-logs', ['**/tests/lib/commands/app-logs.test.js']],
123
+ [
124
+ 'channel-real-fs',
125
+ [
126
+ '**/tests/lib/channels/channel-integration-generator.test.js',
127
+ '**/tests/lib/channels/channel-artifact-generator.test.js'
128
+ ]
129
+ ]
130
+ ];
131
+
132
+ /**
133
+ * @param {Function} makeIsolatedProject - Factory from jest.projects.js
134
+ * @param {boolean} isCI - True when CI or CI_SIMULATION is set
135
+ * @param {object} sharedTransform - Babel-jest transform shared with default project
136
+ * @returns {object[]} Jest multi-project entries
137
+ */
138
+ function buildIsolatedProjects(makeIsolatedProject, isCI, sharedTransform) {
139
+ const projects = ISOLATED_SUITE_ENTRIES.map(([name, testMatch]) =>
140
+ makeIsolatedProject(name, testMatch)
141
+ );
142
+ projects.push(createSetupCiLiveFabrixGuardProject({ isCI, sharedTransform }));
143
+ return projects;
144
+ }
145
+
146
+ module.exports = { buildIsolatedProjects, ISOLATED_SUITE_ENTRIES };