@aifabrix/builder 2.45.0 → 2.46.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 (352) 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/docs-rules.mdc +3 -1
  4. package/.cursor/rules/project-rules.mdc +1 -0
  5. package/README.md +43 -17
  6. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  7. package/jest.config.default.js +2 -1
  8. package/jest.config.isolated.js +2 -1
  9. package/jest.global-live-fabrix-hooks.js +36 -0
  10. package/jest.isolated-projects.js +130 -0
  11. package/jest.projects.js +69 -121
  12. package/lib/api/agent-metadata-validation.api.js +93 -0
  13. package/lib/api/api-response-errors.js +124 -0
  14. package/lib/api/audit-api-helpers.js +68 -0
  15. package/lib/api/audit.api.js +119 -0
  16. package/lib/api/auth-cache.api.js +44 -0
  17. package/lib/api/certificates.api.js +4 -4
  18. package/lib/api/credential.api.js +2 -2
  19. package/lib/api/dataplane-health.api.js +137 -0
  20. package/lib/api/dataplane-sync.api.js +27 -0
  21. package/lib/api/datasources-core.api.js +21 -18
  22. package/lib/api/datasources-extended.api.js +22 -22
  23. package/lib/api/dimensions.api.js +3 -0
  24. package/lib/api/external-systems.api.js +13 -13
  25. package/lib/api/governance-scenario-pack.api.js +159 -0
  26. package/lib/api/governance-scenarios.api.js +39 -0
  27. package/lib/api/groups.api.js +79 -0
  28. package/lib/api/index.js +88 -5
  29. package/lib/api/lifecycle.api.js +77 -0
  30. package/lib/api/pipeline.api.js +7 -5
  31. package/lib/api/protection.api.js +157 -0
  32. package/lib/api/records-bulk.api.js +43 -0
  33. package/lib/api/records-search-parse.js +49 -0
  34. package/lib/api/records-search.api.js +29 -0
  35. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  36. package/lib/api/types/audit.types.js +72 -0
  37. package/lib/api/types/dataplane-health.types.js +27 -0
  38. package/lib/api/types/dimensions.types.js +2 -0
  39. package/lib/api/types/governance-scenarios.types.js +39 -0
  40. package/lib/api/types/protection.types.js +69 -0
  41. package/lib/api/types/records-bulk.types.js +35 -0
  42. package/lib/api/types/records-search.types.js +28 -0
  43. package/lib/api/user-groups.api.js +50 -0
  44. package/lib/api/users.api.js +95 -0
  45. package/lib/api/validation-run.api.js +3 -3
  46. package/lib/api/validation-runner.js +5 -3
  47. package/lib/api/wizard-platform.api.js +3 -3
  48. package/lib/api/wizard.api.js +21 -21
  49. package/lib/app/deploy-config.js +4 -1
  50. package/lib/app/deploy.js +34 -19
  51. package/lib/app/down.js +20 -1
  52. package/lib/app/push.js +4 -5
  53. package/lib/app/register.js +7 -4
  54. package/lib/app/run-env-compose.js +84 -30
  55. package/lib/build/index.js +5 -0
  56. package/lib/certification/sync-system-certification.js +13 -6
  57. package/lib/cli/index.js +8 -2
  58. package/lib/cli/infra-guided-auth.js +109 -0
  59. package/lib/cli/infra-guided.js +91 -69
  60. package/lib/cli/setup-app.help.js +19 -2
  61. package/lib/cli/setup-app.js +58 -23
  62. package/lib/cli/setup-app.test-commands.js +28 -21
  63. package/lib/cli/setup-auth.js +55 -3
  64. package/lib/cli/setup-certification-commands.js +147 -0
  65. package/lib/cli/setup-certification.help.js +141 -0
  66. package/lib/cli/setup-environment.js +19 -2
  67. package/lib/cli/setup-external-system-help.js +62 -0
  68. package/lib/cli/setup-external-system.js +62 -6
  69. package/lib/cli/setup-infra.js +9 -1
  70. package/lib/cli/setup-platform.js +6 -1
  71. package/lib/cli/setup-secrets.js +33 -1
  72. package/lib/cli/setup-utility-help-after.js +65 -0
  73. package/lib/cli/setup-utility-repair.js +198 -0
  74. package/lib/cli/setup-utility-resolve.js +42 -6
  75. package/lib/cli/setup-utility-validate.js +197 -0
  76. package/lib/cli/setup-utility.js +41 -258
  77. package/lib/commands/auth-status-client-tokens.js +214 -0
  78. package/lib/commands/auth-status-dataplane-version.js +269 -0
  79. package/lib/commands/auth-status-display.js +94 -0
  80. package/lib/commands/auth-status.js +111 -53
  81. package/lib/commands/credential-push.js +10 -5
  82. package/lib/commands/datasource-load-export-cli.js +178 -0
  83. package/lib/commands/datasource-test-trust-cli.js +118 -0
  84. package/lib/commands/datasource-unified-test-cli.js +31 -20
  85. package/lib/commands/datasource-unified-test-cli.options.js +22 -3
  86. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  87. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  88. package/lib/commands/datasource.js +68 -1
  89. package/lib/commands/dev-show-display.js +8 -1
  90. package/lib/commands/dimension-value.js +43 -13
  91. package/lib/commands/dimension.js +38 -7
  92. package/lib/commands/governance-cli-shared.js +94 -0
  93. package/lib/commands/governance-command-action.js +132 -0
  94. package/lib/commands/governance-download-external.js +34 -0
  95. package/lib/commands/governance-generate-external.js +71 -0
  96. package/lib/commands/governance-upload-external.js +36 -0
  97. package/lib/commands/governance-verify-external.js +64 -0
  98. package/lib/commands/governance.js +144 -0
  99. package/lib/commands/identity-apply-sync.js +131 -0
  100. package/lib/commands/identity-group-cli.js +146 -0
  101. package/lib/commands/identity-membership-role-cache.js +175 -0
  102. package/lib/commands/identity-shared.js +94 -0
  103. package/lib/commands/identity-user-cli.js +158 -0
  104. package/lib/commands/identity.js +43 -0
  105. package/lib/commands/lifecycle-command-action.js +123 -0
  106. package/lib/commands/lifecycle-external.js +268 -0
  107. package/lib/commands/login.js +56 -17
  108. package/lib/commands/protection-cli-leaves.js +286 -0
  109. package/lib/commands/protection.js +50 -0
  110. package/lib/commands/repair-auth-apply.js +127 -0
  111. package/lib/commands/repair-changed-files.js +41 -0
  112. package/lib/commands/repair-datasource-keys.js +4 -1
  113. package/lib/commands/repair-datasource-run.js +59 -0
  114. package/lib/commands/repair-datasource-test-payload.js +259 -0
  115. package/lib/commands/repair-datasource.js +1 -51
  116. package/lib/commands/repair-env-template.js +64 -13
  117. package/lib/commands/repair-external-run.js +216 -0
  118. package/lib/commands/repair-openapi-sync.js +23 -0
  119. package/lib/commands/repair-persist.js +4 -0
  120. package/lib/commands/repair-rbac.js +52 -1
  121. package/lib/commands/repair-steps.js +145 -0
  122. package/lib/commands/repair.js +29 -286
  123. package/lib/commands/secrets-get.js +184 -0
  124. package/lib/commands/secrets-remove-all.js +3 -1
  125. package/lib/commands/setup-image-refresh.js +146 -0
  126. package/lib/commands/setup-modes.js +158 -162
  127. package/lib/commands/setup-platform-auth.js +76 -0
  128. package/lib/commands/setup-prompts-admin.js +244 -0
  129. package/lib/commands/setup-prompts-platform-mode.js +67 -0
  130. package/lib/commands/setup-prompts-validators.js +36 -0
  131. package/lib/commands/setup-prompts.js +24 -76
  132. package/lib/commands/setup-run-context.js +45 -0
  133. package/lib/commands/setup-spinners.js +39 -0
  134. package/lib/commands/setup.js +27 -5
  135. package/lib/commands/teardown.js +39 -0
  136. package/lib/commands/test-e2e-external.js +61 -14
  137. package/lib/commands/test-governance-cli-options.js +47 -0
  138. package/lib/commands/test-governance-external.js +67 -0
  139. package/lib/commands/test-trust-cli-options.js +32 -0
  140. package/lib/commands/test-trust-external.js +126 -0
  141. package/lib/commands/up-common.js +25 -13
  142. package/lib/commands/up-dataplane.js +50 -13
  143. package/lib/commands/upload-publish-context.js +75 -0
  144. package/lib/commands/upload-sidecar-followups.js +89 -0
  145. package/lib/commands/upload.js +108 -105
  146. package/lib/commands/verify-governance-combined-external.js +61 -0
  147. package/lib/commands/verify-governance-command-action.js +64 -0
  148. package/lib/commands/verify-governance-db.js +102 -0
  149. package/lib/commands/verify-governance-external.js +77 -0
  150. package/lib/commands/verify-governance-result-builders.js +71 -0
  151. package/lib/commands/verify-operations-command-action.js +68 -0
  152. package/lib/commands/verify-operations-external.js +268 -0
  153. package/lib/commands/verify-operations-persist.js +75 -0
  154. package/lib/commands/verify-operations-step-plan.js +68 -0
  155. package/lib/commands/verify-operations-steps.js +111 -0
  156. package/lib/commands/verify-trust-command-action.js +70 -0
  157. package/lib/commands/verify-trust-external.js +67 -0
  158. package/lib/commands/wizard-config-normalizer.js +43 -23
  159. package/lib/commands/wizard-core.js +5 -0
  160. package/lib/core/admin-password-generator.js +38 -0
  161. package/lib/core/admin-secrets-bundle.js +111 -0
  162. package/lib/core/admin-secrets-env-overlay.js +62 -0
  163. package/lib/core/admin-secrets.js +32 -4
  164. package/lib/core/config-attach-extensions.js +3 -0
  165. package/lib/core/config-device-dataplane.js +185 -0
  166. package/lib/core/config-platform-controller.js +44 -0
  167. package/lib/core/config-setup-installation-profile.js +42 -0
  168. package/lib/core/config-setup-platform-mode.js +46 -0
  169. package/lib/core/config.js +46 -36
  170. package/lib/core/secrets-admin-env.js +6 -2
  171. package/lib/core/secrets-ensure.js +4 -0
  172. package/lib/core/secrets-env-content.js +54 -48
  173. package/lib/core/secrets-env-write.js +10 -1
  174. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  175. package/lib/core/setup-installation-profile.js +43 -0
  176. package/lib/core/setup-platform-mode.js +55 -0
  177. package/lib/datasource/agent-trust-debug-log.js +45 -0
  178. package/lib/datasource/agent-trust-fetch.js +115 -0
  179. package/lib/datasource/agent-trust-map.js +101 -0
  180. package/lib/datasource/agent-trust-mock.js +44 -0
  181. package/lib/datasource/agent-trust-run.js +95 -0
  182. package/lib/datasource/agent-trust-timeout.js +25 -0
  183. package/lib/datasource/audit-evidence-display.js +80 -0
  184. package/lib/datasource/audit-evidence-extract-debug.js +115 -0
  185. package/lib/datasource/audit-evidence-extract.js +180 -0
  186. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  187. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  188. package/lib/datasource/audit-evidence-poll.js +109 -0
  189. package/lib/datasource/audit-evidence-run.js +177 -0
  190. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  191. package/lib/datasource/audit-evidence-verify-matrix.js +205 -0
  192. package/lib/datasource/audit-evidence-verify.js +108 -0
  193. package/lib/datasource/bulk-loader-run-batches.js +100 -0
  194. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  195. package/lib/datasource/bulk-loader-service.js +127 -0
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  197. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  198. package/lib/datasource/datasource-exporter-service.js +144 -0
  199. package/lib/datasource/datasource-identifier.js +148 -0
  200. package/lib/datasource/datasource-load-export-context.js +95 -0
  201. package/lib/datasource/integration-context.js +6 -4
  202. package/lib/datasource/local-data-paths.js +145 -0
  203. package/lib/datasource/log-cleaner.js +241 -0
  204. package/lib/datasource/log-viewer.js +111 -6
  205. package/lib/datasource/record-file-parser.js +85 -0
  206. package/lib/datasource/record-mapper.js +129 -0
  207. package/lib/datasource/resolve-app.js +74 -55
  208. package/lib/datasource/test-e2e.js +29 -2
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  211. package/lib/datasource/unified-validation-run.js +47 -18
  212. package/lib/datasource/validate.js +37 -20
  213. package/lib/deployment/environment-poll-status.js +138 -0
  214. package/lib/deployment/environment.js +42 -34
  215. package/lib/external-system/download.js +21 -20
  216. package/lib/external-system/generator.js +5 -1
  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-system-level.js +25 -4
  220. package/lib/external-system/test.js +9 -7
  221. package/lib/generator/external-controller-manifest.js +15 -0
  222. package/lib/governance/governance-cli-errors.js +96 -0
  223. package/lib/governance/governance-download-display.js +38 -0
  224. package/lib/governance/governance-pack-loader.js +70 -0
  225. package/lib/governance/governance-run-display.js +309 -0
  226. package/lib/identity/identity-apply-core.js +108 -0
  227. package/lib/identity/identity-apply-phases.js +244 -0
  228. package/lib/identity/identity-apply-service.js +77 -0
  229. package/lib/identity/identity-csv-parser.js +114 -0
  230. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  231. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  232. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  233. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  234. package/lib/infrastructure/helpers.js +23 -129
  235. package/lib/infrastructure/index.js +5 -6
  236. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  237. package/lib/internal/fs-real-sync.js +29 -1
  238. package/lib/lifecycle/certification-progress.js +231 -0
  239. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  240. package/lib/lifecycle/exit-codes.js +24 -0
  241. package/lib/lifecycle/json-envelope.js +25 -0
  242. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  243. package/lib/lifecycle/logger-quiet.js +29 -0
  244. package/lib/lifecycle/open-api-published.js +59 -0
  245. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  246. package/lib/lifecycle/product-model.js +196 -0
  247. package/lib/lifecycle/report-display.js +471 -0
  248. package/lib/lifecycle/scenario-upload.js +191 -0
  249. package/lib/lifecycle/verify-step-progress.js +87 -0
  250. package/lib/parameters/infra-kv-discovery.js +27 -2
  251. package/lib/protection/auth-context.js +51 -0
  252. package/lib/protection/convert-batch.js +90 -0
  253. package/lib/protection/load.js +41 -0
  254. package/lib/protection/paths.js +158 -0
  255. package/lib/protection/preflight-datasource-ready.js +46 -0
  256. package/lib/protection/protection-create-probe-lines.js +142 -0
  257. package/lib/protection/protection-create-probes.js +95 -0
  258. package/lib/protection/protection-create-scaffold.js +281 -0
  259. package/lib/protection/protection-display-helpers.js +445 -0
  260. package/lib/protection/protection-display.js +215 -0
  261. package/lib/protection/protection-preset-registry.js +97 -0
  262. package/lib/protection/report-exit.js +62 -0
  263. package/lib/protection/resolve.js +202 -0
  264. package/lib/protection/run-commands-validate.js +130 -0
  265. package/lib/protection/run-commands.js +216 -0
  266. package/lib/protection/run-protection-create-helpers.js +134 -0
  267. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  268. package/lib/protection/run-protection-create.js +191 -0
  269. package/lib/protection/scope.js +22 -0
  270. package/lib/protection/sync-after-upload.js +64 -0
  271. package/lib/protection/upload-batch.js +127 -0
  272. package/lib/protection/validate-batch.js +113 -0
  273. package/lib/protection/validate-local.js +65 -0
  274. package/lib/resolvers/dimension-file.js +29 -4
  275. package/lib/schema/application-schema.json +1 -1
  276. package/lib/schema/datasource-test-run.schema.json +89 -6
  277. package/lib/schema/external-datasource.schema.json +2636 -2588
  278. package/lib/schema/external-system.schema.json +1089 -761
  279. package/lib/schema/flag-map-validation-run.json +2 -2
  280. package/lib/schema/infra.parameter.yaml +45 -0
  281. package/lib/schema/protection.schema.json +374 -0
  282. package/lib/schema/type/credential-field-registry.json +642 -0
  283. package/lib/schema/wizard-config.schema.json +1 -1
  284. package/lib/utils/agent-trust-run-display.js +231 -0
  285. package/lib/utils/agent-trust-run-exit.js +59 -0
  286. package/lib/utils/agent-trust-wait-ui.js +94 -0
  287. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  288. package/lib/utils/api.js +55 -31
  289. package/lib/utils/app-relative-path-env.js +112 -0
  290. package/lib/utils/cli-exit-codes.js +30 -0
  291. package/lib/utils/cli-secrets-error-format.js +83 -21
  292. package/lib/utils/cli-sync-options.js +33 -0
  293. package/lib/utils/cli-utils.js +16 -4
  294. package/lib/utils/compose-generate-docker-compose.js +4 -0
  295. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  296. package/lib/utils/config-secrets-path.js +46 -0
  297. package/lib/utils/controller-url.js +88 -1
  298. package/lib/utils/credential-push-ui.js +90 -0
  299. package/lib/utils/credential-secrets-env.js +137 -9
  300. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  301. package/lib/utils/dataplane-cli-version-help.js +74 -0
  302. package/lib/utils/dataplane-resolver.js +129 -2
  303. package/lib/utils/datasource-export-display.js +137 -0
  304. package/lib/utils/datasource-load-display.js +174 -0
  305. package/lib/utils/datasource-load-export-ui.js +120 -0
  306. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  307. package/lib/utils/datasource-test-run-display.js +3 -3
  308. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  309. package/lib/utils/declarative-url-ports.js +3 -3
  310. package/lib/utils/deployment-auth-mode.js +41 -0
  311. package/lib/utils/developer-volume-id.js +33 -0
  312. package/lib/utils/env-copy.js +14 -9
  313. package/lib/utils/env-kv-orphan-lines.js +43 -0
  314. package/lib/utils/error-formatters/network-errors.js +13 -4
  315. package/lib/utils/external-env-template.js +1 -0
  316. package/lib/utils/external-system-readiness-core.js +10 -0
  317. package/lib/utils/external-system-readiness-display.js +80 -23
  318. package/lib/utils/health-check.js +4 -1
  319. package/lib/utils/help-builder.js +35 -26
  320. package/lib/utils/keycloak-realm-ready.js +101 -0
  321. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  322. package/lib/utils/manifest-source-emit.js +24 -0
  323. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  324. package/lib/utils/platform-controller-url.js +156 -0
  325. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  326. package/lib/utils/postgres-wipe.js +9 -2
  327. package/lib/utils/resolve-env-mode.js +47 -0
  328. package/lib/utils/secrets-generator.js +31 -25
  329. package/lib/utils/secrets-missing-error.js +164 -0
  330. package/lib/utils/semver-compare.js +127 -0
  331. package/lib/utils/service-url-label.js +81 -0
  332. package/lib/utils/setup-quiet-output.js +25 -0
  333. package/lib/utils/template-helpers.js +15 -0
  334. package/lib/utils/token-manager-client-credentials.js +201 -0
  335. package/lib/utils/token-manager-messages.js +8 -0
  336. package/lib/utils/token-manager-refresh.js +12 -2
  337. package/lib/utils/token-manager.js +86 -105
  338. package/lib/utils/upload-pipeline-ui.js +98 -0
  339. package/lib/utils/upload-sync-options.js +42 -0
  340. package/lib/utils/url-declarative-public-base.js +21 -3
  341. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  342. package/lib/utils/validation-poll-ui.js +22 -7
  343. package/lib/utils/validation-run-stage.js +45 -0
  344. package/lib/validation/wizard-config-validator.js +58 -19
  345. package/package.json +1 -1
  346. package/templates/applications/dataplane/application.yaml +2 -1
  347. package/templates/applications/dataplane/env.template +36 -1
  348. package/templates/applications/dataplane/rbac.yaml +4 -0
  349. package/templates/applications/miso-controller/env.template +16 -0
  350. package/templates/external-system/README.md.hbs +116 -11
  351. package/templates/python/docker-compose.hbs +19 -18
  352. package/templates/typescript/docker-compose.hbs +18 -17
@@ -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
@@ -5,10 +5,12 @@ alwaysApply: true
5
5
 
6
6
  ## Audience
7
7
 
8
- Documents under **docs/** (including **docs/commands/**) are **CLI developer / user documentation**. The audience is people who use the AI Fabrix Builder CLI or integrate it into workflows. They do not need to know how the CLI talks to the Controller or Dataplane over HTTP.
8
+ Documents under **docs/** (including **docs/commands/**) are **public CLI user documentation**. The audience is people who use the AI Fabrix Builder CLI or integrate it into workflows—they may **not** have access to private monorepos (dataplane, miso-controller, internal plans). They do not need to know how the CLI talks to the Controller or Dataplane over HTTP.
9
9
 
10
10
  ## Do Not Include in CLI User Docs
11
11
 
12
+ - **Links or paths into other product repos (FORBIDDEN)** – No markdown links, examples, or prerequisites that point at private/sibling repositories or their trees: `../../../aifabrix-dataplane/...`, `../../aifabrix-miso/...`, `packages/miso-controller/...`, `integration/<fixture>/README.md` in another repo, `.cursor/plans/` anywhere, `/workspace/...` monorepo layouts, or “see the dataplane/miso-controller repo”. **Only** cross-link within **`docs/`** and use on-disk paths the user owns (`integration/<systemKey>/...`, `builder/<appKey>/...`, `~/.aifabrix/...`).
13
+ - **Internal plan or ticket IDs** – No “Plan 407.1”, “plan section 2.3”, or similar; describe behavior in user terms.
12
14
  - **REST API details** – No HTTP methods, URL paths, or endpoint names (e.g. `GET /api/v1/...`, `POST .../pipeline/upload`).
13
15
  - **Request/response shapes** – No payload structures, status codes, or field names from backend APIs.
14
16
  - **Backend implementation terms** – Avoid referring to “pipeline config endpoint”, “upload endpoint”, or similar; describe what the **command** does from the user’s perspective.
@@ -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/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-e2e
2
2
  mode: create-system
3
3
  source:
4
4
  type: openapi-file
5
- filePath: /workspace/aifabrix-builder/integration/hubspot-test/companies.json
5
+ filePath: ./integration/hubspot-test/companies.json
6
6
  credential:
7
7
  action: skip
8
8
  preferences:
@@ -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,130 @@
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
+ ['infra-parameter-catalog', ['**/tests/lib/parameters/infra-parameter-catalog.test.js']],
44
+ ['urls-local-registry', ['**/tests/lib/utils/urls-local-registry.test.js']],
45
+ ['aifabrix-runtime-config-dir', ['**/tests/lib/utils/aifabrix-runtime-config-dir.test.js']],
46
+ ['platform-env-template-kv-catalog', ['**/tests/lib/parameters/platform-env-template-kv-catalog.test.js']],
47
+ ['resolve-infra-state-paths', ['**/tests/lib/infrastructure/resolve-infra-state-paths.test.js']],
48
+ ['dev-ssh-config-helper', ['**/tests/lib/utils/dev-ssh-config-helper.test.js']],
49
+ ['ssh-key-helper', ['**/tests/lib/utils/ssh-key-helper.test.js']],
50
+ ['secrets-ensure-catalog-fallback', ['**/tests/lib/core/secrets-ensure-catalog-fallback.test.js']],
51
+ ['secrets-ensure', ['**/tests/lib/core/secrets-ensure.test.js']],
52
+ ['url-declarative-vdir-inactive-env', ['**/tests/lib/utils/url-declarative-vdir-inactive-env.test.js']],
53
+ [
54
+ 'url-declarative-user-cfg-per-app-proxy',
55
+ ['**/tests/lib/utils/url-declarative-user-cfg-per-app-proxy.test.js']
56
+ ],
57
+ [
58
+ 'declarative-url-paths-spy-suites',
59
+ [
60
+ '**/tests/lib/utils/url-declarative-expand-traefik-off-no-usercfg.test.js',
61
+ '**/tests/lib/core/secrets-env-declarative-show-urls.test.js',
62
+ '**/tests/lib/utils/url-declarative-registry-internal-docker-origin.test.js'
63
+ ]
64
+ ],
65
+ ['platform-urls-registry-validation', ['**/tests/lib/commands/platform-urls-registry.validation.test.js']],
66
+ ['env-copy-resolve-output', ['**/tests/lib/utils/env-copy-resolve-output.test.js']],
67
+ ['write-env-output-reload', ['**/tests/lib/utils/write-env-output-reload.test.js']],
68
+ ['app-service-env-from-builder', ['**/tests/lib/utils/app-service-env-from-builder.test.js']],
69
+ ['infra-kv-discovery', ['**/tests/lib/parameters/infra-kv-discovery.test.js']],
70
+ ['infra-env-defaults', ['**/tests/lib/utils/infra-env-defaults.test.js']],
71
+ ['compose-traefik-template', ['**/tests/lib/infrastructure/compose-traefik-template.test.js']],
72
+ ['generator-external-rbac', ['**/tests/lib/generator/generator-external-rbac.test.js']],
73
+ ['helpers-ensure-admin-secrets', ['**/tests/lib/infrastructure/helpers-ensure-admin-secrets.test.js']],
74
+ ['secrets-generator', ['**/tests/lib/utils/secrets-generator.test.js']],
75
+ ['ensure-dev-certs-for-remote-docker', ['**/tests/lib/utils/ensure-dev-certs-for-remote-docker.test.js']],
76
+ ['generator-error-paths', ['**/tests/lib/generator/generator-error-paths.test.js']],
77
+ ['generator-validation', ['**/tests/lib/generator/generator-validation.test.js']],
78
+ ['secrets-databaselog', ['**/tests/lib/core/secrets-databaselog.test.js']],
79
+ ['schema-241-alignment', ['**/tests/lib/validation/schema-241-alignment.test.js']],
80
+ ['schema-resolver-order', ['**/tests/lib/utils/schema-resolver-order.test.js']],
81
+ ['app-module', ['**/tests/lib/app/app.test.js']],
82
+ ['admin-secrets', ['**/tests/lib/core/admin-secrets.test.js']],
83
+ ['validate-datasource-parsed', ['**/tests/lib/datasource/validate-datasource-parsed.test.js']],
84
+ [
85
+ 'capability-run-real-fs',
86
+ [
87
+ '**/tests/lib/datasource/run-capability-copy.test.js',
88
+ '**/tests/lib/datasource/run-capability-diff.test.js',
89
+ '**/tests/lib/datasource/run-capability-edit.test.js',
90
+ '**/tests/lib/datasource/run-capability-remove.test.js'
91
+ ]
92
+ ],
93
+ ['log-cleaner', ['**/tests/lib/datasource/log-cleaner.test.js']],
94
+ ['datasource-exporter-service', ['**/tests/lib/datasource/datasource-exporter-service.test.js']],
95
+ ['protection-paths', ['**/tests/lib/protection/paths.test.js']],
96
+ ['protection-resolve', ['**/tests/lib/protection/protection-resolve.test.js']],
97
+ ['protection-create-helpers', ['**/tests/lib/protection/run-protection-create-helpers.test.js']],
98
+ [
99
+ 'governance-pack-loader',
100
+ [
101
+ '**/tests/lib/governance/governance-pack-loader.test.js',
102
+ '**/tests/lib/lifecycle/scenario-upload.test.js'
103
+ ]
104
+ ],
105
+ [
106
+ 'governance-generate-external',
107
+ ['**/tests/lib/commands/governance-generate-external.test.js']
108
+ ],
109
+ ['protection-validate-batch', ['**/tests/lib/protection/validate-batch.test.js']],
110
+ ['aifabrix-runtime-sandbox', ['**/tests/helpers/aifabrix-runtime-sandbox.test.js']],
111
+ ['aifabrix-runtime-backup', ['**/tests/helpers/aifabrix-runtime-backup.test.js']],
112
+ ['paths-jest-sandbox-integration', ['**/tests/lib/utils/paths-jest-sandbox-integration.test.js']],
113
+ ['secrets-remove-all-guard', ['**/tests/lib/commands/secrets-remove-all-guard.test.js']]
114
+ ];
115
+
116
+ /**
117
+ * @param {Function} makeIsolatedProject - Factory from jest.projects.js
118
+ * @param {boolean} isCI - True when CI or CI_SIMULATION is set
119
+ * @param {object} sharedTransform - Babel-jest transform shared with default project
120
+ * @returns {object[]} Jest multi-project entries
121
+ */
122
+ function buildIsolatedProjects(makeIsolatedProject, isCI, sharedTransform) {
123
+ const projects = ISOLATED_SUITE_ENTRIES.map(([name, testMatch]) =>
124
+ makeIsolatedProject(name, testMatch)
125
+ );
126
+ projects.push(createSetupCiLiveFabrixGuardProject({ isCI, sharedTransform }));
127
+ return projects;
128
+ }
129
+
130
+ module.exports = { buildIsolatedProjects, ISOLATED_SUITE_ENTRIES };
package/jest.projects.js CHANGED
@@ -4,6 +4,9 @@
4
4
  * @fileoverview
5
5
  */
6
6
 
7
+ const { globalLiveFabrixHooks } = require('./jest.global-live-fabrix-hooks');
8
+ const { buildIsolatedProjects } = require('./jest.isolated-projects');
9
+
7
10
  // Detect CI environment (GitHub Actions, CI simulation, etc.)
8
11
  const isCI = process.env.CI === 'true' || process.env.CI_SIMULATION === 'true';
9
12
 
@@ -31,7 +34,7 @@ function makeIsolatedProject(displayName, testMatch) {
31
34
  testPathIgnorePatterns: ['/node_modules/', '\\\\node_modules\\\\'],
32
35
  setupFiles: ['<rootDir>/tests/capture-real-fs.js'],
33
36
  setupFilesAfterEnv: ['<rootDir>/tests/setup.js'],
34
- testTimeout: isCI ? 10000 : 5000,
37
+ testTimeout: isCI ? 15000 : 8000,
35
38
  maxWorkers: 1
36
39
  };
37
40
  }
@@ -79,10 +82,18 @@ const defaultProject = {
79
82
  'lib/datasource/log-viewer-structural.test.js',
80
83
  'lib/datasource/log-viewer-run.test.js',
81
84
  'log-viewer-run\\.test\\.js',
85
+ '/tests/lib/datasource/audit-evidence-extract.test.js',
86
+ '\\\\tests\\\\lib\\\\datasource\\\\audit-evidence-extract.test.js',
87
+ 'lib/datasource/audit-evidence-extract.test.js',
88
+ 'audit-evidence-extract\\.test\\.js',
82
89
  '/tests/lib/commands/parameters-validate.test.js',
83
90
  '\\\\tests\\\\lib\\\\commands\\\\parameters-validate.test.js',
84
91
  'lib/commands/parameters-validate.test.js',
85
92
  'parameters-validate\\.test\\.js',
93
+ '/tests/lib/commands/test-e2e-external.test.js',
94
+ '\\\\tests\\\\lib\\\\commands\\\\test-e2e-external.test.js',
95
+ 'lib/commands/test-e2e-external.test.js',
96
+ 'test-e2e-external\\.test\\.js',
86
97
  '/tests/lib/commands/repair-openapi-sync.test.js',
87
98
  '\\\\tests\\\\lib\\\\commands\\\\repair-openapi-sync.test.js',
88
99
  'lib/commands/repair-openapi-sync.test.js',
@@ -221,10 +232,6 @@ const defaultProject = {
221
232
  '\\\\tests\\\\lib\\\\utils\\\\secrets-generator.test.js',
222
233
  'lib/utils/secrets-generator.test.js',
223
234
  'secrets-generator\\.test\\.js',
224
- '/tests/lib/app/app-uncovered-lines.test.js',
225
- '\\\\tests\\\\lib\\\\app\\\\app-uncovered-lines.test.js',
226
- 'lib/app/app-uncovered-lines.test.js',
227
- 'app-uncovered-lines\\.test\\.js',
228
235
  '/tests/lib/utils/ensure-dev-certs-for-remote-docker.test.js',
229
236
  '\\\\tests\\\\lib\\\\utils\\\\ensure-dev-certs-for-remote-docker.test.js',
230
237
  'lib/utils/ensure-dev-certs-for-remote-docker.test.js',
@@ -278,7 +285,59 @@ const defaultProject = {
278
285
  '/tests/lib/datasource/run-capability-remove.test.js',
279
286
  '\\\\tests\\\\lib\\\\datasource\\\\run-capability-remove.test.js',
280
287
  'lib/datasource/run-capability-remove.test.js',
281
- 'run-capability-remove\\.test\\.js'
288
+ 'run-capability-remove\\.test\\.js',
289
+ '/tests/lib/datasource/log-cleaner.test.js',
290
+ '\\\\tests\\\\lib\\\\datasource\\\\log-cleaner.test.js',
291
+ 'lib/datasource/log-cleaner.test.js',
292
+ 'log-cleaner\\.test\\.js',
293
+ '/tests/lib/datasource/datasource-exporter-service.test.js',
294
+ '\\\\tests\\\\lib\\\\datasource\\\\datasource-exporter-service.test.js',
295
+ 'lib/datasource/datasource-exporter-service.test.js',
296
+ 'datasource-exporter-service\\.test\\.js',
297
+ '/tests/lib/protection/paths.test.js',
298
+ '\\\\tests\\\\lib\\\\protection\\\\paths.test.js',
299
+ 'lib/protection/paths.test.js',
300
+ 'protection/paths\\.test\\.js',
301
+ '/tests/lib/protection/protection-resolve.test.js',
302
+ '\\\\tests\\\\lib\\\\protection\\\\protection-resolve.test.js',
303
+ 'lib/protection/protection-resolve.test.js',
304
+ 'protection-resolve\\.test\\.js',
305
+ '/tests/lib/protection/run-protection-create-helpers.test.js',
306
+ '\\\\tests\\\\lib\\\\protection\\\\run-protection-create-helpers.test.js',
307
+ 'lib/protection/run-protection-create-helpers.test.js',
308
+ 'run-protection-create-helpers\\.test\\.js',
309
+ '/tests/lib/governance/governance-pack-loader.test.js',
310
+ '\\\\tests\\\\lib\\\\governance\\\\governance-pack-loader.test.js',
311
+ 'lib/governance/governance-pack-loader.test.js',
312
+ 'governance-pack-loader\\.test\\.js',
313
+ '/tests/lib/lifecycle/scenario-upload.test.js',
314
+ '\\\\tests\\\\lib\\\\lifecycle\\\\scenario-upload.test.js',
315
+ 'lib/lifecycle/scenario-upload.test.js',
316
+ 'scenario-upload\\.test\\.js',
317
+ '/tests/lib/commands/governance-generate-external.test.js',
318
+ '\\\\tests\\\\lib\\\\commands\\\\governance-generate-external.test.js',
319
+ 'lib/commands/governance-generate-external.test.js',
320
+ 'governance-generate-external\\.test\\.js',
321
+ '/tests/lib/protection/validate-batch.test.js',
322
+ '\\\\tests\\\\lib\\\\protection\\\\validate-batch.test.js',
323
+ 'lib/protection/validate-batch.test.js',
324
+ 'validate-batch\\.test\\.js',
325
+ '/tests/helpers/aifabrix-runtime-sandbox.test.js',
326
+ '\\\\tests\\\\helpers\\\\aifabrix-runtime-sandbox.test.js',
327
+ 'helpers/aifabrix-runtime-sandbox\\.test\\.js',
328
+ '/tests/helpers/aifabrix-runtime-backup.test.js',
329
+ '\\\\tests\\\\helpers\\\\aifabrix-runtime-backup.test.js',
330
+ 'helpers/aifabrix-runtime-backup\\.test\\.js',
331
+ '/tests/lib/utils/paths-jest-sandbox-integration.test.js',
332
+ '\\\\tests\\\\lib\\\\utils\\\\paths-jest-sandbox-integration.test.js',
333
+ 'paths-jest-sandbox-integration\\.test\\.js',
334
+ '/tests/lib/commands/secrets-remove-all-guard.test.js',
335
+ '\\\\tests\\\\lib\\\\commands\\\\secrets-remove-all-guard.test.js',
336
+ 'lib/commands/secrets-remove-all-guard.test.js',
337
+ 'secrets-remove-all-guard\\.test\\.js',
338
+ '/tests/setup-ci-live-fabrix-guard.test.js',
339
+ '\\\\tests\\\\setup-ci-live-fabrix-guard.test.js',
340
+ 'setup-ci-live-fabrix-guard\\.test\\.js'
282
341
  ];
283
342
  if (process.env.INCLUDE_LOCAL_TESTS !== 'true') {
284
343
  patterns.push('/tests/local/');
@@ -288,124 +347,12 @@ const defaultProject = {
288
347
  })(),
289
348
  setupFiles: ['<rootDir>/tests/capture-real-fs.js'],
290
349
  setupFilesAfterEnv: ['<rootDir>/tests/setup.js'],
291
- testTimeout: isCI ? 10000 : 5000,
350
+ testTimeout: isCI ? 15000 : 8000,
292
351
  detectOpenHandles: true,
293
352
  maxWorkers: 1
294
353
  };
295
354
 
296
- const isolatedProjects = [
297
- makeIsolatedProject('cli-utils', ['**/tests/lib/utils/cli-utils.test.js']),
298
- makeIsolatedProject('external-system-display', ['**/tests/lib/utils/external-system-display.test.js']),
299
- makeIsolatedProject('dev-hosts-helper', ['**/tests/lib/utils/dev-hosts-helper.test.js']),
300
- makeIsolatedProject('parameters-validate', ['**/tests/lib/commands/parameters-validate.test.js']),
301
- makeIsolatedProject('repair-openapi-sync', ['**/tests/lib/commands/repair-openapi-sync.test.js']),
302
- makeIsolatedProject('paths-app-listing', ['**/tests/lib/utils/paths-app-listing.test.js']),
303
- makeIsolatedProject('paths-system-builder-resolution', [
304
- '**/tests/lib/utils/paths-system-builder-resolution.test.js'
305
- ]),
306
- makeIsolatedProject('manifest-location', ['**/tests/lib/utils/manifest-location.test.js']),
307
- makeIsolatedProject('installation-log', ['**/tests/lib/utils/installation-log.test.js']),
308
- makeIsolatedProject('secrets-ancestor-paths', ['**/tests/lib/utils/secrets-ancestor-paths.test.js']),
309
- makeIsolatedProject('datasource-validation-watch', [
310
- '**/tests/lib/utils/datasource-validation-watch.test.js'
311
- ]),
312
- makeIsolatedProject('log-viewer', [
313
- '**/tests/lib/datasource/log-viewer.test.js',
314
- '**/tests/lib/datasource/log-viewer-structural.test.js',
315
- '**/tests/lib/datasource/log-viewer-run.test.js'
316
- ]),
317
- makeIsolatedProject('manifest-source-emit', ['**/tests/lib/utils/manifest-source-emit.test.js']),
318
- makeIsolatedProject('register-aifabrix-shell-env', [
319
- '**/tests/lib/utils/register-aifabrix-shell-env.test.js'
320
- ]),
321
- makeIsolatedProject('datasource-test-run-schema-sync', [
322
- '**/tests/lib/utils/datasource-test-run-schema-sync.test.js'
323
- ]),
324
- makeIsolatedProject('infra-platform-contract', [
325
- '**/tests/lib/parameters/infra-platform-contract.test.js'
326
- ]),
327
- makeIsolatedProject('application-frontdoor-paths-contract', [
328
- '**/tests/lib/templates/application-frontdoor-paths.contract.test.js'
329
- ]),
330
- makeIsolatedProject('database-secret-values', [
331
- '**/tests/lib/parameters/database-secret-values.test.js'
332
- ]),
333
- makeIsolatedProject('infra-parameter-validate', [
334
- '**/tests/lib/parameters/infra-parameter-validate.test.js'
335
- ]),
336
- makeIsolatedProject('infra-parameter-catalog', [
337
- '**/tests/lib/parameters/infra-parameter-catalog.test.js'
338
- ]),
339
- makeIsolatedProject('urls-local-registry', ['**/tests/lib/utils/urls-local-registry.test.js']),
340
- makeIsolatedProject('aifabrix-runtime-config-dir', [
341
- '**/tests/lib/utils/aifabrix-runtime-config-dir.test.js'
342
- ]),
343
- makeIsolatedProject('platform-env-template-kv-catalog', [
344
- '**/tests/lib/parameters/platform-env-template-kv-catalog.test.js'
345
- ]),
346
- makeIsolatedProject('resolve-infra-state-paths', [
347
- '**/tests/lib/infrastructure/resolve-infra-state-paths.test.js'
348
- ]),
349
- makeIsolatedProject('dev-ssh-config-helper', [
350
- '**/tests/lib/utils/dev-ssh-config-helper.test.js'
351
- ]),
352
- makeIsolatedProject('ssh-key-helper', ['**/tests/lib/utils/ssh-key-helper.test.js']),
353
- makeIsolatedProject('secrets-ensure-catalog-fallback', [
354
- '**/tests/lib/core/secrets-ensure-catalog-fallback.test.js'
355
- ]),
356
- makeIsolatedProject('secrets-ensure', ['**/tests/lib/core/secrets-ensure.test.js']),
357
- makeIsolatedProject('url-declarative-vdir-inactive-env', [
358
- '**/tests/lib/utils/url-declarative-vdir-inactive-env.test.js'
359
- ]),
360
- makeIsolatedProject('url-declarative-user-cfg-per-app-proxy', [
361
- '**/tests/lib/utils/url-declarative-user-cfg-per-app-proxy.test.js'
362
- ]),
363
- makeIsolatedProject('declarative-url-paths-spy-suites', [
364
- '**/tests/lib/utils/url-declarative-expand-traefik-off-no-usercfg.test.js',
365
- '**/tests/lib/core/secrets-env-declarative-show-urls.test.js',
366
- '**/tests/lib/utils/url-declarative-registry-internal-docker-origin.test.js'
367
- ]),
368
- makeIsolatedProject('platform-urls-registry-validation', [
369
- '**/tests/lib/commands/platform-urls-registry.validation.test.js'
370
- ]),
371
- makeIsolatedProject('env-copy-resolve-output', ['**/tests/lib/utils/env-copy-resolve-output.test.js']),
372
- makeIsolatedProject('write-env-output-reload', ['**/tests/lib/utils/write-env-output-reload.test.js']),
373
- makeIsolatedProject('app-service-env-from-builder', [
374
- '**/tests/lib/utils/app-service-env-from-builder.test.js'
375
- ]),
376
- makeIsolatedProject('infra-kv-discovery', ['**/tests/lib/parameters/infra-kv-discovery.test.js']),
377
- makeIsolatedProject('infra-env-defaults', ['**/tests/lib/utils/infra-env-defaults.test.js']),
378
- makeIsolatedProject('compose-traefik-template', [
379
- '**/tests/lib/infrastructure/compose-traefik-template.test.js'
380
- ]),
381
- makeIsolatedProject('generator-external-rbac', [
382
- '**/tests/lib/generator/generator-external-rbac.test.js'
383
- ]),
384
- makeIsolatedProject('helpers-ensure-admin-secrets', [
385
- '**/tests/lib/infrastructure/helpers-ensure-admin-secrets.test.js'
386
- ]),
387
- makeIsolatedProject('secrets-generator', ['**/tests/lib/utils/secrets-generator.test.js']),
388
- makeIsolatedProject('app-uncovered-lines', ['**/tests/lib/app/app-uncovered-lines.test.js']),
389
- makeIsolatedProject('ensure-dev-certs-for-remote-docker', [
390
- '**/tests/lib/utils/ensure-dev-certs-for-remote-docker.test.js'
391
- ]),
392
- makeIsolatedProject('generator-error-paths', ['**/tests/lib/generator/generator-error-paths.test.js']),
393
- makeIsolatedProject('generator-validation', ['**/tests/lib/generator/generator-validation.test.js']),
394
- makeIsolatedProject('secrets-databaselog', ['**/tests/lib/core/secrets-databaselog.test.js']),
395
- makeIsolatedProject('schema-241-alignment', ['**/tests/lib/validation/schema-241-alignment.test.js']),
396
- makeIsolatedProject('schema-resolver-order', ['**/tests/lib/utils/schema-resolver-order.test.js']),
397
- makeIsolatedProject('app-module', ['**/tests/lib/app/app.test.js']),
398
- makeIsolatedProject('admin-secrets', ['**/tests/lib/core/admin-secrets.test.js']),
399
- makeIsolatedProject('validate-datasource-parsed', [
400
- '**/tests/lib/datasource/validate-datasource-parsed.test.js'
401
- ]),
402
- makeIsolatedProject('capability-run-real-fs', [
403
- '**/tests/lib/datasource/run-capability-copy.test.js',
404
- '**/tests/lib/datasource/run-capability-diff.test.js',
405
- '**/tests/lib/datasource/run-capability-edit.test.js',
406
- '**/tests/lib/datasource/run-capability-remove.test.js'
407
- ])
408
- ];
355
+ const isolatedProjects = buildIsolatedProjects(makeIsolatedProject, isCI, sharedTransform);
409
356
 
410
357
  const allProjects = [defaultProject, ...isolatedProjects];
411
358
 
@@ -415,5 +362,6 @@ module.exports = {
415
362
  makeIsolatedProject,
416
363
  defaultProject,
417
364
  isolatedProjects,
418
- allProjects
365
+ allProjects,
366
+ globalLiveFabrixHooks
419
367
  };