@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
@@ -0,0 +1,286 @@
1
+ /**
2
+ * @fileoverview Protection subcommand registration (keeps setupProtectionCommands under line limit).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const logger = require('../utils/logger');
8
+ const { resolveProtectionArgument } = require('../protection/resolve');
9
+ const {
10
+ runProtectionValidate,
11
+ runProtectionUpload,
12
+ runProtectionList,
13
+ runProtectionShow,
14
+ runProtectionDelete
15
+ } = require('../protection/run-commands');
16
+ const { runProtectionCreate } = require('../protection/run-protection-create');
17
+
18
+ const SHARED_OPTS = [
19
+ ['-e, --env <environment>', 'Environment key'],
20
+ ['-v, --verbose', 'Verbose output']
21
+ ];
22
+
23
+ const PROTECTION_CREATE_HELP_AFTER = `
24
+
25
+ Examples:
26
+ $ aifabrix protection create hubspot-companies --type country-sales
27
+ $ aifabrix protection create hr-persons --type department-manager
28
+ $ aifabrix protection create erp-projects --type project-team
29
+ $ aifabrix protection create hubspot-companies --dimension-key country --dry-run
30
+ $ aifabrix protection create hubspot-companies --type country-sales --force
31
+
32
+ Preset types:
33
+ country-sales, department-manager, customer-team, project-team, static-region, owner-direct
34
+ `;
35
+
36
+ const PROTECTION_VALIDATE_HELP_AFTER = `
37
+
38
+ Examples:
39
+ $ aifabrix protection validate hubspot-companies
40
+ $ aifabrix protection validate hubspot-companies --simulate
41
+ $ aifabrix protection validate hubspot-companies --warnings-as-errors
42
+ $ aifabrix protection validate hubspot-companies --json
43
+ `;
44
+
45
+ const PROTECTION_UPLOAD_HELP_AFTER = `
46
+
47
+ Examples:
48
+ $ aifabrix protection upload hubspot-companies
49
+ $ aifabrix protection upload hubspot-companies --dry-run
50
+ $ aifabrix protection upload hubspot-companies --no-sync
51
+ `;
52
+
53
+ const PROTECTION_LIST_HELP_AFTER = `
54
+
55
+ Examples:
56
+ $ aifabrix protection list
57
+ $ aifabrix protection list --page 1 --page-size 50
58
+ $ aifabrix protection list --filter enabled:eq:true
59
+ $ aifabrix protection list --json
60
+ `;
61
+
62
+ const PROTECTION_SHOW_HELP_AFTER = `
63
+
64
+ Examples:
65
+ $ aifabrix protection show hubspot-companies
66
+ $ aifabrix protection show hubspot-companies -v
67
+ $ aifabrix protection show hubspot-companies --json
68
+ `;
69
+
70
+ const PROTECTION_DELETE_HELP_AFTER = `
71
+
72
+ Examples:
73
+ $ aifabrix protection delete hubspot-companies
74
+ $ aifabrix protection delete hubspot-companies --yes
75
+ `;
76
+
77
+ /**
78
+ * @param {import('commander').Command} cmd
79
+ * @param {string} name
80
+ * @param {string} description
81
+ * @param {Function} action
82
+ * @param {Array<[string, string]>} extraOpts
83
+ * @param {string} helpAfter
84
+ */
85
+ function addProtectionLeaf(cmd, name, description, action, extraOpts = [], helpAfter = '') {
86
+ const leaf = cmd.command(name).description(description);
87
+ for (const [flags, desc] of [...SHARED_OPTS, ...extraOpts]) {
88
+ leaf.option(flags, desc);
89
+ }
90
+ if (helpAfter) {
91
+ leaf.addHelpText('after', helpAfter);
92
+ }
93
+ leaf.action(async(datasourceKey, options) => {
94
+ try {
95
+ const code = await action(datasourceKey, options);
96
+ if (code && code !== 0) process.exit(code);
97
+ } catch (err) {
98
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
99
+ logger.error(formatBlockingError(err.message || String(err)));
100
+ process.exit(1);
101
+ }
102
+ });
103
+ }
104
+
105
+ /**
106
+ * @param {import('commander').Command} protection
107
+ */
108
+ function registerProtectionCreate(protection) {
109
+ const leaf = protection
110
+ .command('create <datasourceKey>')
111
+ .description(
112
+ 'Probe dataplane datasource + Controller dimension, then scaffold under integration/.protection/'
113
+ );
114
+ for (const [flags, desc] of SHARED_OPTS) {
115
+ leaf.option(flags, desc);
116
+ }
117
+ leaf
118
+ .option('--type <type>', 'Preset type (country-sales, department-manager, customer-team, project-team, static-region, owner-direct)')
119
+ .option('--dimension-key <key>', 'Dimension catalog key (inferred from --type when omitted)')
120
+ .option('--field <name>', 'Metadata field used by preset value templates when needed')
121
+ .option('--fk-name <name>', 'FK binding name in expressions (default: same as dimension key)')
122
+ .option('--protection-key <key>', 'metadata.key (default: <datasource>-<dimension>-access)')
123
+ .option('--display-name <text>', 'metadata.displayName')
124
+ .option('--rule-key <key>', 'Rule key inside spec.rules[0]')
125
+ .option('--principal-expression <expr>', 'Group principal expression (default: Sales {{fk.<fk>.metadata.iso3}} Users)')
126
+ .option('--value-expression <expr>', 'Grant valueExpression (default: {{fk.<fk>.metadata.iso2}})')
127
+ .option('--dry-run', 'Print YAML to stdout; do not write file')
128
+ .option('--force', 'Overwrite existing integration/.protection/<datasourceKey> manifest')
129
+ .option('--disabled', 'Set spec.enabled to false', false)
130
+ .addHelpText('after', PROTECTION_CREATE_HELP_AFTER)
131
+ .action(async(datasourceKey, options) => {
132
+ try {
133
+ const code = await runProtectionCreate(datasourceKey, {
134
+ ...options,
135
+ dryRun: options.dryRun === true,
136
+ force: options.force === true,
137
+ verbose: options.verbose === true,
138
+ disabled: options.disabled === true
139
+ }, logger);
140
+ if (code && code !== 0) process.exit(code);
141
+ } catch (err) {
142
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
143
+ if (Array.isArray(err.probeLines)) {
144
+ for (const line of err.probeLines) {
145
+ logger.log(line);
146
+ }
147
+ }
148
+ logger.error(formatBlockingError(err.message || String(err)));
149
+ process.exit(1);
150
+ }
151
+ });
152
+ }
153
+
154
+ /**
155
+ * @param {import('commander').Command} protection
156
+ */
157
+ function registerProtectionValidate(protection) {
158
+ addProtectionLeaf(
159
+ protection,
160
+ 'validate <datasourceKey>',
161
+ 'Validate protection manifest (local schema + dataplane)',
162
+ async(datasourceKey, options) => {
163
+ const resolved = resolveProtectionArgument(datasourceKey);
164
+ return runProtectionValidate(resolved.datasourceKey, resolved.manifest, {
165
+ ...options,
166
+ manifestPath: resolved.manifestPath,
167
+ warningsAsErrors: options.warningsAsErrors === true,
168
+ simulate: options.simulate === true,
169
+ json: options.json === true,
170
+ verbose: options.verbose === true
171
+ }, logger);
172
+ },
173
+ [
174
+ ['--json', 'Output dataplane report as JSON'],
175
+ ['--warnings-as-errors', 'Pass strict=true to dataplane validate'],
176
+ ['--simulate', 'Run simulate after validate passes']
177
+ ],
178
+ PROTECTION_VALIDATE_HELP_AFTER
179
+ );
180
+ }
181
+
182
+ /**
183
+ * @param {import('commander').Command} protection
184
+ */
185
+ function registerProtectionUpload(protection) {
186
+ addProtectionLeaf(
187
+ protection,
188
+ 'upload <datasourceKey>',
189
+ 'Validate and upload protection manifest to dataplane',
190
+ async(datasourceKey, options) => {
191
+ const resolved = resolveProtectionArgument(datasourceKey);
192
+ return runProtectionUpload(resolved.datasourceKey, resolved.manifest, {
193
+ ...options,
194
+ manifestPath: resolved.manifestPath,
195
+ warningsAsErrors: options.warningsAsErrors === true,
196
+ dryRun: options.dryRun === true,
197
+ noSync: options.noSync === true,
198
+ verbose: options.verbose === true
199
+ }, logger);
200
+ },
201
+ [
202
+ ['--dry-run', 'Validate only; no upload or sync'],
203
+ ['--no-sync', 'Skip datasource sync after upload']
204
+ ],
205
+ PROTECTION_UPLOAD_HELP_AFTER
206
+ );
207
+ }
208
+
209
+ /**
210
+ * @param {import('commander').Command} protection
211
+ */
212
+ function registerProtectionList(protection) {
213
+ const leaf = protection.command('list').description('List deployed protection manifests on dataplane');
214
+ for (const [flags, desc] of SHARED_OPTS) {
215
+ leaf.option(flags, desc);
216
+ }
217
+ leaf
218
+ .option('--json', 'Output paginated list as JSON')
219
+ .option('--page <n>', 'Page (1-based)', (v) => parseInt(v, 10))
220
+ .option('--page-size <n>', 'Page size', (v) => parseInt(v, 10))
221
+ .option('--filter <expr>', 'Filter (e.g. enabled:eq:true)')
222
+ .addHelpText('after', PROTECTION_LIST_HELP_AFTER)
223
+ .action(async(options) => {
224
+ try {
225
+ const code = await runProtectionList(
226
+ {
227
+ ...options,
228
+ json: options.json === true,
229
+ verbose: options.verbose === true
230
+ },
231
+ logger
232
+ );
233
+ if (code && code !== 0) process.exit(code);
234
+ } catch (err) {
235
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
236
+ logger.error(formatBlockingError(err.message || String(err)));
237
+ process.exit(1);
238
+ }
239
+ });
240
+ }
241
+
242
+ /**
243
+ * @param {import('commander').Command} protection
244
+ */
245
+ function registerProtectionShow(protection) {
246
+ addProtectionLeaf(
247
+ protection,
248
+ 'show <datasourceKey>',
249
+ 'Show deployed protection state from dataplane',
250
+ async(datasourceKey, options) =>
251
+ runProtectionShow(datasourceKey, {
252
+ ...options,
253
+ json: options.json === true,
254
+ verbose: options.verbose === true
255
+ }, logger),
256
+ [['--json', 'Output merged manifest + status as JSON']],
257
+ PROTECTION_SHOW_HELP_AFTER
258
+ );
259
+ }
260
+
261
+ /**
262
+ * @param {import('commander').Command} protection
263
+ */
264
+ function registerProtectionDelete(protection) {
265
+ addProtectionLeaf(
266
+ protection,
267
+ 'delete <datasourceKey>',
268
+ 'Delete deployed protection for datasource',
269
+ async(datasourceKey, options) =>
270
+ runProtectionDelete(datasourceKey, {
271
+ ...options,
272
+ yes: options.yes === true
273
+ }, logger),
274
+ [['--yes', 'Skip confirmation prompt']],
275
+ PROTECTION_DELETE_HELP_AFTER
276
+ );
277
+ }
278
+
279
+ module.exports = {
280
+ registerProtectionCreate,
281
+ registerProtectionValidate,
282
+ registerProtectionUpload,
283
+ registerProtectionList,
284
+ registerProtectionShow,
285
+ registerProtectionDelete
286
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview Protection manifest CLI commands.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const {
10
+ registerProtectionCreate,
11
+ registerProtectionValidate,
12
+ registerProtectionUpload,
13
+ registerProtectionList,
14
+ registerProtectionShow,
15
+ registerProtectionDelete
16
+ } = require('./protection-cli-leaves');
17
+
18
+ const PROTECTION_HELP_AFTER = `
19
+
20
+ Examples:
21
+ $ aifabrix protection create hubspot-companies --type country-sales
22
+ $ aifabrix protection validate hubspot-companies --simulate
23
+ $ aifabrix protection upload hubspot-companies --dry-run
24
+ $ aifabrix protection list
25
+ $ aifabrix protection show hubspot-companies
26
+ $ aifabrix protection delete hubspot-companies --yes
27
+
28
+ Per-command help: aifabrix protection <command> --help
29
+ `;
30
+
31
+ /**
32
+ * @param {import('commander').Command} program
33
+ */
34
+ function setupProtectionCommands(program) {
35
+ const protection = program
36
+ .command('protection')
37
+ .description('Manage protection manifests in integration/.protection/ (repo root)')
38
+ .addHelpText('after', PROTECTION_HELP_AFTER);
39
+
40
+ registerProtectionCreate(protection);
41
+ registerProtectionValidate(protection);
42
+ registerProtectionUpload(protection);
43
+ registerProtectionList(protection);
44
+ registerProtectionShow(protection);
45
+ registerProtectionDelete(protection);
46
+ }
47
+
48
+ module.exports = {
49
+ setupProtectionCommands
50
+ };
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Repair --auth: canonical authentication blocks and bearerToken preset.
3
+ *
4
+ * Applies canonical authentication blocks for repair --auth.
5
+ *
6
+ * @fileoverview Repair authentication method application
7
+ * @author AI Fabrix Team
8
+ * @version 1.0.0
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const { buildAuthenticationFromMethod } = require('../external-system/generator');
14
+
15
+ /** Repair CLI --auth values (normalized lowercase). */
16
+ const ALLOWED_REPAIR_AUTH = [
17
+ 'oauth2',
18
+ 'aad',
19
+ 'apikey',
20
+ 'bearertoken',
21
+ 'bearerkey',
22
+ 'basic',
23
+ 'queryparam',
24
+ 'oidc',
25
+ 'hmac',
26
+ 'none'
27
+ ];
28
+
29
+ const PRESERVED_VARIABLE_KEYS = ['baseUrl', 'testEndpoint'];
30
+
31
+ /**
32
+ * @param {string} authOption - Raw --auth value
33
+ * @returns {string} Normalized lowercase auth option
34
+ */
35
+ function normalizeRepairAuthOption(authOption) {
36
+ return String(authOption || '').trim().toLowerCase();
37
+ }
38
+
39
+ /**
40
+ * @param {string} authOption - Normalized --auth value
41
+ * @returns {boolean}
42
+ */
43
+ function isAllowedRepairAuth(authOption) {
44
+ return ALLOWED_REPAIR_AUTH.includes(normalizeRepairAuthOption(authOption));
45
+ }
46
+
47
+ /**
48
+ * Builds authentication block for repair --auth.
49
+ * @param {string} systemKey - System key
50
+ * @param {string} authOption - Normalized repair auth (e.g. bearertoken, apikey)
51
+ * @returns {{ method: string, variables: Object, security: Object }}
52
+ */
53
+ function buildAuthenticationForRepair(systemKey, authOption) {
54
+ const normalized = normalizeRepairAuthOption(authOption);
55
+ const schemaMethod =
56
+ normalized === 'queryparam'
57
+ ? 'queryParam'
58
+ : normalized === 'bearertoken' || normalized === 'bearerkey'
59
+ ? 'bearerToken'
60
+ : normalized;
61
+ return buildAuthenticationFromMethod(systemKey, schemaMethod);
62
+ }
63
+
64
+ /**
65
+ * Merges preserved connectivity fields from existing auth into template variables.
66
+ * @param {Object} mergedVariables - Target variables object (mutated)
67
+ * @param {Object} existingVars - Prior authentication.variables
68
+ */
69
+ function mergePreservedAuthVariables(mergedVariables, existingVars) {
70
+ if (!existingVars || typeof existingVars !== 'object') return;
71
+ for (const key of PRESERVED_VARIABLE_KEYS) {
72
+ if (existingVars[key] !== undefined && existingVars[key] !== null) {
73
+ mergedVariables[key] = existingVars[key];
74
+ }
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Human-readable label for repair change log.
80
+ * @param {string} authOption - Normalized repair auth
81
+ * @returns {string}
82
+ */
83
+ function repairAuthChangeLabel(authOption) {
84
+ const normalized = normalizeRepairAuthOption(authOption);
85
+ if (normalized === 'bearertoken' || normalized === 'bearerkey') return 'bearerToken';
86
+ return normalized;
87
+ }
88
+
89
+ const MISSING_TEST_ENDPOINT_WARNING =
90
+ 'authentication.variables.testEndpoint is missing for apikey/bearerToken auth — add a GET URL for credential/E2E tests (e.g. /crm/v3/objects/contacts?limit=1, or a path resolved against baseUrl).';
91
+
92
+ /**
93
+ * Warn when apikey auth (including bearerToken preset) has no testEndpoint.
94
+ * @param {Object} authentication - authentication block on system file
95
+ * @param {string[]} warnings - Mutable warnings list
96
+ */
97
+ function appendTestEndpointWarningIfMissing(authentication, warnings) {
98
+ const method = String(authentication?.method || '').toLowerCase();
99
+ if (method !== 'apikey' && method !== 'bearertoken') return;
100
+ const testEndpoint = String(authentication?.variables?.testEndpoint || '').trim();
101
+ if (testEndpoint) return;
102
+ if (warnings.includes(MISSING_TEST_ENDPOINT_WARNING)) return;
103
+ warnings.push(MISSING_TEST_ENDPOINT_WARNING);
104
+ }
105
+
106
+ /**
107
+ * Audit system authentication after repair (with or without --auth).
108
+ * @param {Object} systemParsed - Parsed system config
109
+ * @param {string[]} warnings - Mutable warnings list
110
+ */
111
+ function auditRepairAuthenticationWarnings(systemParsed, warnings) {
112
+ const authentication = systemParsed?.authentication || systemParsed?.auth;
113
+ if (!authentication || typeof authentication !== 'object') return;
114
+ appendTestEndpointWarningIfMissing(authentication, warnings);
115
+ }
116
+
117
+ module.exports = {
118
+ ALLOWED_REPAIR_AUTH,
119
+ MISSING_TEST_ENDPOINT_WARNING,
120
+ normalizeRepairAuthOption,
121
+ isAllowedRepairAuth,
122
+ buildAuthenticationForRepair,
123
+ mergePreservedAuthVariables,
124
+ repairAuthChangeLabel,
125
+ appendTestEndpointWarningIfMissing,
126
+ auditRepairAuthenticationWarnings
127
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Track integration files touched during repair for CLI summary output.
3
+ *
4
+ * @fileoverview Repair changed-file tracking
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+
13
+ /**
14
+ * Ensures backup/repair context has changed-file buckets.
15
+ * @param {Object} ctx - Repair backup context
16
+ * @returns {{ changedFiles: string[], wouldChangeFiles: string[] }}
17
+ */
18
+ function ensureChangedFileBuckets(ctx) {
19
+ if (!ctx) return { changedFiles: [], wouldChangeFiles: [] };
20
+ if (!Array.isArray(ctx.changedFiles)) ctx.changedFiles = [];
21
+ if (!Array.isArray(ctx.wouldChangeFiles)) ctx.wouldChangeFiles = [];
22
+ return { changedFiles: ctx.changedFiles, wouldChangeFiles: ctx.wouldChangeFiles };
23
+ }
24
+
25
+ /**
26
+ * Records a file path that repair wrote or would write (dry-run).
27
+ * @param {string} filePath - Path to file
28
+ * @param {Object} ctx - Repair context with dryRun, changedFiles, wouldChangeFiles
29
+ */
30
+ function trackRepairWrite(filePath, ctx) {
31
+ if (!filePath || !ctx) return;
32
+ const abs = path.resolve(filePath);
33
+ const { changedFiles, wouldChangeFiles } = ensureChangedFileBuckets(ctx);
34
+ const bucket = ctx.dryRun ? wouldChangeFiles : changedFiles;
35
+ if (!bucket.includes(abs)) bucket.push(abs);
36
+ }
37
+
38
+ module.exports = {
39
+ ensureChangedFileBuckets,
40
+ trackRepairWrite
41
+ };
@@ -16,6 +16,7 @@ const path = require('path');
16
16
  const fs = require('fs');
17
17
  const { loadConfigFile, writeConfigFile } = require('../utils/config-format');
18
18
  const { backupIntegrationFile } = require('../utils/integration-file-backup');
19
+ const { trackRepairWrite } = require('./repair-changed-files');
19
20
 
20
21
  /**
21
22
  * Returns suffix from a canonical-format filename: <systemKey>-datasource-<suffix>.<ext>.
@@ -174,8 +175,9 @@ function normalizeDatasourceKeysAndFilenames(appPath, datasourceFiles, systemKey
174
175
 
175
176
  if (parsed.key !== canonicalKey) {
176
177
  parsed.key = canonicalKey;
178
+ const fullPath = path.join(appPath, fileName);
179
+ trackRepairWrite(fullPath, backupCtx);
177
180
  if (!dryRun) {
178
- const fullPath = path.join(appPath, fileName);
179
181
  backupIntegrationFile(fullPath, backupCtx);
180
182
  writeConfigFile(fullPath, parsed);
181
183
  }
@@ -185,6 +187,7 @@ function normalizeDatasourceKeysAndFilenames(appPath, datasourceFiles, systemKey
185
187
  if (fileName !== canonicalFileName) {
186
188
  const oldPath = path.join(appPath, fileName);
187
189
  const newPath = path.join(appPath, canonicalFileName);
190
+ trackRepairWrite(newPath, backupCtx);
188
191
  if (!dryRun && fs.existsSync(oldPath) && !fs.existsSync(newPath)) {
189
192
  backupIntegrationFile(oldPath, backupCtx);
190
193
  fs.renameSync(oldPath, newPath);
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Batch datasource file repair during external integration repair.
3
+ *
4
+ * @fileoverview Run repairDatasourceFile across integration datasource files
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+ const fs = require('fs');
13
+ const chalk = require('chalk');
14
+ const logger = require('../utils/logger');
15
+ const { loadConfigFile, writeConfigFile } = require('../utils/config-format');
16
+ const { backupIntegrationFile } = require('../utils/integration-file-backup');
17
+ const { trackRepairWrite } = require('./repair-changed-files');
18
+ const { repairDatasourceFile } = require('./repair-datasource');
19
+
20
+ /**
21
+ * @param {string} appPath
22
+ * @param {string[]} datasourceFiles
23
+ * @param {Object} options
24
+ * @param {boolean} dryRun
25
+ * @param {string[]} changes
26
+ * @returns {boolean}
27
+ */
28
+ function runDatasourceRepairs(appPath, datasourceFiles, options, dryRun, changes) {
29
+ if (!datasourceFiles || datasourceFiles.length === 0) return false;
30
+ let updated = false;
31
+ for (const fileName of datasourceFiles) {
32
+ const filePath = path.join(appPath, fileName);
33
+ if (!fs.existsSync(filePath)) continue;
34
+ try {
35
+ const parsed = loadConfigFile(filePath);
36
+ const { updated: fileUpdated, changes: fileChanges } = repairDatasourceFile(parsed, {
37
+ expose: options.expose,
38
+ sync: options.sync,
39
+ test: options.test
40
+ });
41
+ if (fileUpdated) {
42
+ updated = true;
43
+ fileChanges.forEach(c => changes.push(`${fileName}: ${c}`));
44
+ if (!dryRun) {
45
+ backupIntegrationFile(filePath, options.backupCtx);
46
+ writeConfigFile(filePath, parsed);
47
+ }
48
+ trackRepairWrite(filePath, options.backupCtx);
49
+ }
50
+ } catch (err) {
51
+ logger.log(chalk.yellow(`⚠ Could not repair datasource ${fileName}: ${err.message}`));
52
+ }
53
+ }
54
+ return updated;
55
+ }
56
+
57
+ module.exports = {
58
+ runDatasourceRepairs
59
+ };