@aifabrix/builder 2.45.5 → 2.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/.cursor/rules/cli-layout.mdc +2 -0
  2. package/.cursor/rules/cli-product-neutral.mdc +43 -0
  3. package/.cursor/rules/project-rules.mdc +1 -0
  4. package/.npmrc.token +1 -0
  5. package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
  6. package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
  7. package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
  8. package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
  9. package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
  10. package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
  11. package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
  12. package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
  13. package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
  14. package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
  15. package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
  16. package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
  17. package/.temp/validation/summary.txt +5 -0
  18. package/README.md +43 -17
  19. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  20. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  21. package/jest.config.default.js +2 -1
  22. package/jest.config.isolated.js +2 -1
  23. package/jest.global-live-fabrix-hooks.js +36 -0
  24. package/jest.isolated-projects.js +146 -0
  25. package/jest.projects.js +65 -136
  26. package/lib/api/api-response-errors.js +124 -0
  27. package/lib/api/dataplane-health.api.js +19 -7
  28. package/lib/api/governance-scenario-pack.api.js +159 -0
  29. package/lib/api/index.js +43 -3
  30. package/lib/api/lifecycle.api.js +98 -0
  31. package/lib/api/pipeline.api.js +3 -1
  32. package/lib/api/records-bulk.api.js +14 -1
  33. package/lib/api/resource-types.api.js +107 -0
  34. package/lib/api/runtime-configuration.api.js +72 -0
  35. package/lib/api/types/resource-types.types.js +45 -0
  36. package/lib/api/user-groups.api.js +9 -9
  37. package/lib/api/users.api.js +8 -8
  38. package/lib/api/validation-runner.js +3 -1
  39. package/lib/api/wizard.api.js +10 -2
  40. package/lib/app/deploy-config.js +4 -1
  41. package/lib/app/down.js +78 -27
  42. package/lib/app/index.js +2 -2
  43. package/lib/app/push.js +4 -5
  44. package/lib/app/register.js +7 -4
  45. package/lib/app/run-env-compose.js +84 -30
  46. package/lib/app/run-resolve-image.js +2 -1
  47. package/lib/app/run-stop-containers.js +113 -0
  48. package/lib/app/run.js +1 -31
  49. package/lib/app/show-display.js +35 -0
  50. package/lib/app/show.js +32 -1
  51. package/lib/build/index.js +22 -5
  52. package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
  53. package/lib/certification/sync-system-certification.js +13 -6
  54. package/lib/channels/add-channel.js +348 -0
  55. package/lib/channels/channel-artifact-generator.js +141 -0
  56. package/lib/channels/channel-audit.js +101 -0
  57. package/lib/channels/channel-auth-context.js +37 -0
  58. package/lib/channels/channel-credential.js +200 -0
  59. package/lib/channels/channel-display-name.js +64 -0
  60. package/lib/channels/channel-external-system.js +106 -0
  61. package/lib/channels/channel-integration-generator.js +274 -0
  62. package/lib/channels/channel-probe.js +89 -0
  63. package/lib/channels/channel-runtime-resolver.js +152 -0
  64. package/lib/channels/channel-status-display.js +141 -0
  65. package/lib/channels/channel-targets.js +115 -0
  66. package/lib/cli/index.js +20 -4
  67. package/lib/cli/infra-guided-auth.js +109 -0
  68. package/lib/cli/infra-guided.js +84 -81
  69. package/lib/cli/setup-app.help.js +0 -31
  70. package/lib/cli/setup-app.js +82 -5
  71. package/lib/cli/setup-app.test-commands.js +5 -57
  72. package/lib/cli/setup-auth.js +25 -0
  73. package/lib/cli/setup-certification-commands.js +147 -0
  74. package/lib/cli/setup-certification.help.js +141 -0
  75. package/lib/cli/setup-environment.js +19 -2
  76. package/lib/cli/setup-external-system-help.js +62 -0
  77. package/lib/cli/setup-external-system.js +25 -3
  78. package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
  79. package/lib/cli/setup-infra-up-platform-action.js +2 -1
  80. package/lib/cli/setup-infra.js +9 -1
  81. package/lib/cli/setup-platform.js +6 -1
  82. package/lib/cli/setup-secrets.js +33 -1
  83. package/lib/cli/setup-utility-help-after.js +25 -2
  84. package/lib/cli/setup-utility-repair.js +198 -0
  85. package/lib/cli/setup-utility-resolve.js +44 -5
  86. package/lib/cli/setup-utility-validate.js +197 -0
  87. package/lib/cli/setup-utility.js +4 -239
  88. package/lib/commands/app-logs.js +54 -26
  89. package/lib/commands/app.js +41 -0
  90. package/lib/commands/auth-status-client-tokens.js +214 -0
  91. package/lib/commands/auth-status-dataplane-version.js +142 -68
  92. package/lib/commands/auth-status.js +43 -54
  93. package/lib/commands/channel.js +58 -0
  94. package/lib/commands/datasource-test-trust-cli.js +27 -23
  95. package/lib/commands/datasource-unified-test-cli.js +6 -3
  96. package/lib/commands/datasource-unified-test-cli.options.js +5 -1
  97. package/lib/commands/datasource.js +8 -8
  98. package/lib/commands/dev-show-display.js +8 -1
  99. package/lib/commands/governance-cli-shared.js +94 -0
  100. package/lib/commands/governance-command-action.js +132 -0
  101. package/lib/commands/governance-download-external.js +34 -0
  102. package/lib/commands/governance-generate-external.js +71 -0
  103. package/lib/commands/governance-upload-external.js +36 -0
  104. package/lib/commands/governance-verify-external.js +64 -0
  105. package/lib/commands/governance.js +144 -0
  106. package/lib/commands/identity-apply-sync.js +49 -8
  107. package/lib/commands/identity-group-cli.js +66 -26
  108. package/lib/commands/identity-membership-role-cache.js +58 -37
  109. package/lib/commands/identity-shared.js +22 -1
  110. package/lib/commands/identity-user-cli.js +80 -34
  111. package/lib/commands/lifecycle-command-action.js +123 -0
  112. package/lib/commands/lifecycle-external.js +268 -0
  113. package/lib/commands/login.js +11 -2
  114. package/lib/commands/repair-auth-apply.js +153 -0
  115. package/lib/commands/repair-auth-config.js +8 -13
  116. package/lib/commands/repair-changed-files.js +41 -0
  117. package/lib/commands/repair-datasource-com-v2.js +15 -0
  118. package/lib/commands/repair-datasource-keys.js +4 -1
  119. package/lib/commands/repair-datasource-run.js +59 -0
  120. package/lib/commands/repair-datasource-service-contract.js +206 -0
  121. package/lib/commands/repair-datasource-test-payload.js +259 -0
  122. package/lib/commands/repair-datasource.js +49 -64
  123. package/lib/commands/repair-env-template.js +76 -25
  124. package/lib/commands/repair-external-run.js +216 -0
  125. package/lib/commands/repair-openapi-sync.js +49 -4
  126. package/lib/commands/repair-persist.js +4 -0
  127. package/lib/commands/repair-rbac.js +52 -1
  128. package/lib/commands/repair-steps.js +160 -0
  129. package/lib/commands/repair-system-alignment.js +7 -4
  130. package/lib/commands/repair.js +29 -296
  131. package/lib/commands/resource-type.js +371 -0
  132. package/lib/commands/secrets-get.js +184 -0
  133. package/lib/commands/secrets-remove-all.js +3 -1
  134. package/lib/commands/setup-image-refresh.js +146 -0
  135. package/lib/commands/setup-modes.js +158 -162
  136. package/lib/commands/setup-platform-auth.js +76 -0
  137. package/lib/commands/setup-prompts-admin.js +244 -0
  138. package/lib/commands/setup-prompts-platform-mode.js +70 -0
  139. package/lib/commands/setup-prompts-validators.js +36 -0
  140. package/lib/commands/setup-prompts.js +24 -76
  141. package/lib/commands/setup-run-context.js +45 -0
  142. package/lib/commands/setup-spinners.js +39 -0
  143. package/lib/commands/setup.js +27 -5
  144. package/lib/commands/teardown.js +39 -0
  145. package/lib/commands/test-e2e-external.js +24 -8
  146. package/lib/commands/test-governance-external.js +3 -24
  147. package/lib/commands/test-trust-external.js +48 -100
  148. package/lib/commands/up-common.js +57 -13
  149. package/lib/commands/up-dataplane.js +56 -15
  150. package/lib/commands/upload-publish-context.js +75 -0
  151. package/lib/commands/upload-sidecar-followups.js +89 -0
  152. package/lib/commands/upload.js +113 -110
  153. package/lib/commands/verify-governance-combined-external.js +61 -0
  154. package/lib/commands/verify-governance-command-action.js +64 -0
  155. package/lib/commands/verify-governance-db.js +102 -0
  156. package/lib/commands/verify-governance-external.js +77 -0
  157. package/lib/commands/verify-governance-result-builders.js +71 -0
  158. package/lib/commands/verify-operations-command-action.js +68 -0
  159. package/lib/commands/verify-operations-external.js +268 -0
  160. package/lib/commands/verify-operations-persist.js +75 -0
  161. package/lib/commands/verify-operations-step-plan.js +68 -0
  162. package/lib/commands/verify-operations-steps.js +111 -0
  163. package/lib/commands/verify-trust-command-action.js +73 -0
  164. package/lib/commands/verify-trust-external.js +59 -0
  165. package/lib/commands/wizard-config-normalizer.js +43 -23
  166. package/lib/commands/wizard-core.js +2 -0
  167. package/lib/core/admin-password-generator.js +38 -0
  168. package/lib/core/admin-secrets-bundle.js +111 -0
  169. package/lib/core/admin-secrets-env-overlay.js +62 -0
  170. package/lib/core/admin-secrets.js +32 -4
  171. package/lib/core/config-attach-extensions.js +3 -0
  172. package/lib/core/config-platform-controller.js +44 -0
  173. package/lib/core/config-setup-installation-profile.js +42 -0
  174. package/lib/core/config-setup-platform-mode.js +46 -0
  175. package/lib/core/config.js +46 -36
  176. package/lib/core/secrets-admin-env.js +6 -2
  177. package/lib/core/secrets-ensure.js +4 -0
  178. package/lib/core/secrets-env-content.js +54 -48
  179. package/lib/core/secrets-env-write.js +10 -1
  180. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  181. package/lib/core/setup-installation-profile.js +43 -0
  182. package/lib/core/setup-platform-mode.js +90 -0
  183. package/lib/datasource/agent-trust-debug-log.js +1 -1
  184. package/lib/datasource/agent-trust-run.js +5 -3
  185. package/lib/datasource/audit-evidence-extract-debug.js +30 -18
  186. package/lib/datasource/audit-evidence-extract.js +7 -4
  187. package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
  188. package/lib/datasource/bulk-loader-run-batches.js +15 -3
  189. package/lib/datasource/capability/capability-diff-slice.js +2 -2
  190. package/lib/datasource/capability/capability-manifest.js +254 -0
  191. package/lib/datasource/capability/capability-resolve.js +3 -4
  192. package/lib/datasource/capability/copy-operations.js +5 -3
  193. package/lib/datasource/capability/remove-operations.js +2 -1
  194. package/lib/datasource/capability/run-capability-copy.js +32 -4
  195. package/lib/datasource/capability/run-capability-diff.js +3 -3
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -4
  197. package/lib/datasource/capability/run-capability-edit.js +4 -7
  198. package/lib/datasource/capability/run-capability-relate.js +2 -4
  199. package/lib/datasource/capability/run-capability-remove.js +2 -4
  200. package/lib/datasource/capability/validate-capability-slice.js +2 -1
  201. package/lib/datasource/datasource-identifier.js +2 -1
  202. package/lib/datasource/datasource-load-export-context.js +3 -0
  203. package/lib/datasource/datasource-validate-display.js +1 -1
  204. package/lib/datasource/field-reference-validator.js +24 -3
  205. package/lib/datasource/log-cleaner.js +2 -2
  206. package/lib/datasource/log-viewer.js +8 -8
  207. package/lib/datasource/orphan-profiles-validator.js +98 -0
  208. package/lib/datasource/test-e2e.js +4 -1
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run.js +5 -2
  211. package/lib/datasource/validate.js +41 -23
  212. package/lib/deployment/environment-poll-status.js +138 -0
  213. package/lib/deployment/environment.js +42 -34
  214. package/lib/external-system/download-helpers.js +87 -0
  215. package/lib/external-system/download.js +78 -138
  216. package/lib/external-system/generator.js +1 -55
  217. package/lib/external-system/integration-auth-context.js +45 -0
  218. package/lib/external-system/test-auth.js +12 -5
  219. package/lib/external-system/test.js +16 -21
  220. package/lib/generator/builders.js +11 -1
  221. package/lib/generator/external-controller-manifest.js +18 -0
  222. package/lib/generator/split.js +3 -1
  223. package/lib/generator/wizard.js +1 -28
  224. package/lib/governance/governance-cli-errors.js +96 -0
  225. package/lib/governance/governance-download-display.js +38 -0
  226. package/lib/governance/governance-run-display.js +215 -25
  227. package/lib/identity/fk-reference.js +65 -0
  228. package/lib/identity/identity-apply-core.js +13 -58
  229. package/lib/identity/identity-apply-phases.js +5 -1
  230. package/lib/identity/identity-display.js +243 -0
  231. package/lib/identity/identity-response-helpers.js +52 -0
  232. package/lib/identity/identity-sync-errors.js +62 -0
  233. package/lib/identity/resolve-user-id.js +129 -0
  234. package/lib/identity/username-default.js +31 -0
  235. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  236. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  237. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  238. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  239. package/lib/infrastructure/helpers.js +23 -129
  240. package/lib/infrastructure/index.js +5 -6
  241. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  242. package/lib/lifecycle/certification-progress.js +231 -0
  243. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  244. package/lib/lifecycle/exit-codes.js +24 -0
  245. package/lib/lifecycle/json-envelope.js +25 -0
  246. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  247. package/lib/lifecycle/logger-quiet.js +29 -0
  248. package/lib/lifecycle/open-api-published.js +59 -0
  249. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  250. package/lib/lifecycle/product-model.js +196 -0
  251. package/lib/lifecycle/report-display-trust.js +70 -0
  252. package/lib/lifecycle/report-display.js +472 -0
  253. package/lib/lifecycle/scenario-upload.js +191 -0
  254. package/lib/lifecycle/verify-step-progress.js +87 -0
  255. package/lib/parameters/infra-kv-discovery.js +27 -2
  256. package/lib/protection/auth-context.js +10 -4
  257. package/lib/resolvers/datasource-resolver.js +2 -3
  258. package/lib/resolvers/resource-type-file.js +159 -0
  259. package/lib/schema/application-schema.json +17 -1
  260. package/lib/schema/datasource-test-run.schema.json +89 -6
  261. package/lib/schema/deployment-rules.yaml +2 -1
  262. package/lib/schema/external-datasource.schema.json +2947 -2619
  263. package/lib/schema/external-system.schema.json +1418 -761
  264. package/lib/schema/infra.parameter.yaml +45 -0
  265. package/lib/schema/type/credential-field-registry.json +103 -97
  266. package/lib/schema/type/document-storage.json +9 -5
  267. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  268. package/lib/utils/api.js +55 -31
  269. package/lib/utils/app-relative-path-env.js +112 -0
  270. package/lib/utils/app-run-containers.js +25 -2
  271. package/lib/utils/authentication-shape.js +224 -0
  272. package/lib/utils/build-copy.js +36 -5
  273. package/lib/utils/build-resolve-image.js +66 -12
  274. package/lib/utils/celery-companion-apps.js +53 -0
  275. package/lib/utils/cli-secrets-error-format.js +83 -21
  276. package/lib/utils/cli-utils.js +20 -4
  277. package/lib/utils/compose-celery-worker.js +23 -0
  278. package/lib/utils/compose-generate-docker-compose.js +13 -1
  279. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  280. package/lib/utils/config-secrets-path.js +46 -0
  281. package/lib/utils/configuration-env-resolver.js +36 -0
  282. package/lib/utils/controller-url.js +88 -1
  283. package/lib/utils/credential-secrets-env-kv.js +216 -0
  284. package/lib/utils/credential-secrets-env.js +175 -257
  285. package/lib/utils/dataplane-resolver.js +18 -2
  286. package/lib/utils/declarative-url-ports.js +27 -4
  287. package/lib/utils/deployment-auth-mode.js +41 -0
  288. package/lib/utils/developer-volume-id.js +33 -0
  289. package/lib/utils/docker-build.js +1 -4
  290. package/lib/utils/env-copy.js +14 -9
  291. package/lib/utils/env-kv-orphan-lines.js +43 -0
  292. package/lib/utils/error-formatters/network-errors.js +13 -4
  293. package/lib/utils/external-env-template.js +11 -3
  294. package/lib/utils/external-system-readiness-core.js +10 -0
  295. package/lib/utils/external-system-readiness-display.js +80 -23
  296. package/lib/utils/external-system-validators.js +8 -2
  297. package/lib/utils/health-check.js +4 -1
  298. package/lib/utils/help-builder.js +13 -8
  299. package/lib/utils/keycloak-realm-ready.js +101 -0
  300. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  301. package/lib/utils/manifest-source-emit.js +2 -0
  302. package/lib/utils/paths.js +25 -0
  303. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  304. package/lib/utils/platform-controller-url.js +157 -0
  305. package/lib/utils/platform-kv-ref.js +57 -0
  306. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  307. package/lib/utils/postgres-wipe.js +9 -2
  308. package/lib/utils/resolve-env-mode.js +47 -0
  309. package/lib/utils/runtime-configuration-download.js +189 -0
  310. package/lib/utils/runtime-configuration-values.js +119 -0
  311. package/lib/utils/schema-loader.js +19 -4
  312. package/lib/utils/secrets-generator.js +31 -25
  313. package/lib/utils/secrets-missing-error.js +164 -0
  314. package/lib/utils/service-url-label.js +81 -0
  315. package/lib/utils/setup-quiet-output.js +25 -0
  316. package/lib/utils/template-helpers.js +15 -0
  317. package/lib/utils/token-manager-client-credentials.js +201 -0
  318. package/lib/utils/token-manager-messages.js +8 -0
  319. package/lib/utils/token-manager-refresh.js +12 -2
  320. package/lib/utils/token-manager.js +86 -105
  321. package/lib/utils/upload-pipeline-ui.js +12 -5
  322. package/lib/utils/upload-sync-options.js +42 -0
  323. package/lib/utils/url-declarative-public-base.js +21 -3
  324. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  325. package/lib/utils/validation-poll-ui.js +8 -0
  326. package/lib/utils/validation-run-stage.js +45 -0
  327. package/lib/utils/worker-sidecars.js +142 -0
  328. package/lib/validation/external-manifest-validator.js +2 -0
  329. package/lib/validation/runtime-configuration-rules.js +98 -0
  330. package/lib/validation/validate-display-dimensions.js +154 -0
  331. package/lib/validation/validate-display-sections.js +276 -0
  332. package/lib/validation/validate-display-steps.js +67 -0
  333. package/lib/validation/validate-display.js +24 -402
  334. package/package.json +1 -1
  335. package/templates/applications/dataplane/application.yaml +7 -1
  336. package/templates/applications/dataplane/env.template +50 -14
  337. package/templates/applications/dataplane/rbac.yaml +108 -1
  338. package/templates/applications/miso-controller/application.yaml +2 -2
  339. package/templates/applications/miso-controller/env.template +53 -122
  340. package/templates/applications/miso-controller/rbac.yaml +28 -13
  341. package/templates/channels/chatgpt/install.template.md.hbs +49 -0
  342. package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
  343. package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
  344. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
  345. package/templates/channels/slack/install.template.md.hbs +49 -0
  346. package/templates/channels/slack/manifest.template.json.hbs +66 -0
  347. package/templates/channels/teams-bot/install.template.md.hbs +49 -0
  348. package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
  349. package/templates/channels/web-embed/install.template.md.hbs +49 -0
  350. package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
  351. package/templates/external-system/README.md.hbs +74 -17
  352. package/templates/python/docker-compose.hbs +75 -18
  353. package/templates/typescript/docker-compose.hbs +70 -17
  354. package/lib/commands/test-governance-command-action.js +0 -55
  355. package/lib/commands/test-trust-command-action.js +0 -118
@@ -12,207 +12,13 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- const path = require('path');
16
15
  const fs = require('fs');
17
- const chalk = require('chalk');
18
16
  const { detectAppType } = require('../utils/paths');
19
- const { resolveApplicationConfigPath, resolveRbacPath } = require('../utils/app-config-resolver');
20
- const { loadConfigFile, writeConfigFile, isYamlPath } = require('../utils/config-format');
21
- const logger = require('../utils/logger');
22
- const { repairEnvTemplate, normalizeSystemFileAuthAndConfig } = require('./repair-env-template');
23
- const { repairDatasourceFile } = require('./repair-datasource');
24
- const { mergeRbacFromDatasources, extractRbacFromSystem, migrateSystemRbacIntoRbacFile } = require('./repair-rbac');
17
+ const { resolveApplicationConfigPath } = require('../utils/app-config-resolver');
18
+ const { loadConfigFile, isYamlPath } = require('../utils/config-format');
25
19
  const { discoverIntegrationFiles, buildEffectiveDatasourceFiles } = require('./repair-internal');
26
- const { normalizeDatasourceKeysAndFilenames } = require('./repair-datasource-keys');
27
- const { backupIntegrationFile } = require('../utils/integration-file-backup');
28
- const { maybeSyncOpenApiFilesForMcp } = require('./repair-openapi-sync');
29
- const {
30
- alignAppKeyWithSystem,
31
- alignDatasourceSystemKeys,
32
- alignSystemFileDataSources,
33
- ensureExternalIntegrationBlock,
34
- removeAuthVarsFromConfiguration,
35
- resolveSystemContext
36
- } = require('./repair-system-alignment');
37
- const { persistChangesAndRegenerate, regenerateReadmeIfRequested } = require('./repair-persist');
38
-
39
- /** Allowed authentication methods for repair --auth (matches external-system schema) */
40
- const ALLOWED_AUTH = ['oauth2', 'aad', 'apikey', 'basic', 'queryParam', 'oidc', 'hmac', 'none'];
41
-
42
- function createRbacFromSystemIfNeeded(opts) {
43
- const { appPath, systemFilePath, systemParsed, dryRun, changes, format, backupCtx } = opts;
44
- if (resolveRbacPath(appPath)) return false;
45
- const rbacFromSystem = extractRbacFromSystem(systemParsed);
46
- if (!rbacFromSystem) return false;
47
- if (!dryRun) {
48
- const rbacFormat = format === 'json' ? 'json' : 'yaml';
49
- const defaultRbacPath = path.join(appPath, rbacFormat === 'json' ? 'rbac.json' : 'rbac.yaml');
50
- writeConfigFile(defaultRbacPath, rbacFromSystem, rbacFormat);
51
- delete systemParsed.roles;
52
- delete systemParsed.permissions;
53
- backupIntegrationFile(systemFilePath, backupCtx);
54
- writeConfigFile(systemFilePath, systemParsed);
55
- }
56
- changes.push('Created rbac.yaml from system roles/permissions');
57
- changes.push('Removed roles/permissions from system file (now in rbac file)');
58
- return true;
59
- }
60
-
61
- /**
62
- * Runs datasource repair for each file (v2.4 root dimensions, metadataSchema; optional expose/sync/test).
63
- * @param {string} appPath - Application path
64
- * @param {string[]} datasourceFiles - Datasource file names
65
- * @param {Object} options - { expose?: boolean, sync?: boolean, test?: boolean }
66
- * @param {boolean} dryRun - If true, do not write
67
- * @param {string[]} changes - Array to append change descriptions to
68
- * @returns {boolean} True if any datasource was updated
69
- */
70
- function runDatasourceRepairs(appPath, datasourceFiles, options, dryRun, changes) {
71
- if (!datasourceFiles || datasourceFiles.length === 0) return false;
72
- let updated = false;
73
- for (const fileName of datasourceFiles) {
74
- const filePath = path.join(appPath, fileName);
75
- if (!fs.existsSync(filePath)) continue;
76
- try {
77
- const parsed = loadConfigFile(filePath);
78
- const { updated: fileUpdated, changes: fileChanges } = repairDatasourceFile(parsed, {
79
- expose: options.expose,
80
- sync: options.sync,
81
- test: options.test
82
- });
83
- if (fileUpdated) {
84
- updated = true;
85
- fileChanges.forEach(c => changes.push(`${fileName}: ${c}`));
86
- if (!dryRun) {
87
- backupIntegrationFile(filePath, options.backupCtx);
88
- writeConfigFile(filePath, parsed);
89
- }
90
- }
91
- } catch (err) {
92
- logger.log(chalk.yellow(`⚠ Could not repair datasource ${fileName}: ${err.message}`));
93
- }
94
- }
95
- return updated;
96
- }
97
-
98
- function maybeRepairRbac(appPath, systemFilePath, systemParsed, datasourceFiles, options) {
99
- if (!options.rbac) return { rbacMigratedFromSystem: false, rbacMergeUpdated: false };
100
- const { dryRun, changes, backupCtx, rbacFmt } = options;
101
- const rbacMigratedFromSystem = migrateSystemRbacIntoRbacFile(appPath, systemFilePath, systemParsed, { dryRun, changes, backupCtx });
102
- const rbacMergeUpdated = mergeRbacFromDatasources(appPath, systemParsed, datasourceFiles, extractRbacFromSystem, {
103
- format: rbacFmt,
104
- dryRun,
105
- changes,
106
- backupCtx
107
- });
108
- return { rbacMigratedFromSystem, rbacMergeUpdated };
109
- }
20
+ const { runRepairExternalIntegration } = require('./repair-external-run');
110
21
 
111
- /**
112
- * Apply --auth: replace system file authentication with canonical block for the given method.
113
- * Preserves existing authentication.variables (e.g. baseUrl, tokenUrl) from the current system file.
114
- * @param {Object} ctx - Context with systemParsed, systemKey, auth, dryRun, changes
115
- * @returns {boolean} True if auth was replaced
116
- */
117
- function applyAuthMethod(ctx) {
118
- if (!ctx.auth || typeof ctx.auth !== 'string') return false;
119
- const method = ctx.auth.trim().toLowerCase();
120
- if (!ALLOWED_AUTH.includes(method)) {
121
- throw new Error(
122
- `Invalid --auth "${ctx.auth}". Allowed methods: ${ALLOWED_AUTH.join(', ')}`
123
- );
124
- }
125
- const existingAuth = ctx.systemParsed.authentication || ctx.systemParsed.auth || {};
126
- const { buildAuthenticationFromMethod } = require('../external-system/generator');
127
- const newAuth = buildAuthenticationFromMethod(ctx.systemKey, method);
128
- const existingVars =
129
- existingAuth.variables && typeof existingAuth.variables === 'object'
130
- ? existingAuth.variables
131
- : {};
132
- // When switching auth method, keep only connectivity fields from the wizard draft.
133
- // Do not let OAuth-era variables (tokenUrl, scope, headerName, …) override the new method.
134
- const mergedVariables = { ...newAuth.variables };
135
- for (const key of ['baseUrl', 'testEndpoint']) {
136
- if (existingVars[key] !== undefined && existingVars[key] !== null) {
137
- mergedVariables[key] = existingVars[key];
138
- }
139
- }
140
- ctx.systemParsed.authentication = {
141
- ...newAuth,
142
- variables: mergedVariables
143
- };
144
- if (existingAuth.displayName !== undefined) {
145
- ctx.systemParsed.authentication.displayName = existingAuth.displayName;
146
- }
147
- ctx.changes.push(`Set authentication method to ${method}`);
148
- return true;
149
- }
150
-
151
- /**
152
- * Runs all repair steps (integration block, system dataSources, auth/config, app key, datasource keys, rbac, env.template).
153
- * @param {Object} ctx - Context with appPath, configPath, variables, systemFilePath, systemParsed, systemKey, systemFiles, datasourceFiles, dryRun, changes, auth?, backupCtx?
154
- * @returns {{ updated: boolean, appKeyFixed: boolean, datasourceKeysFixed: boolean, rbacFileCreated: boolean, envTemplateRepaired: boolean }}
155
- */
156
- function runRepairSteps(ctx) {
157
- const bc = ctx.backupCtx;
158
- let updated = ensureExternalIntegrationBlock(
159
- ctx.variables, ctx.systemFiles, ctx.datasourceFiles, ctx.changes
160
- );
161
- const authReplaced = applyAuthMethod(ctx);
162
- updated = updated || authReplaced;
163
- const systemAuthConfigNormalized = normalizeSystemFileAuthAndConfig(
164
- ctx.systemParsed, ctx.systemKey, ctx.changes
165
- );
166
- const systemDataSourcesAligned = alignSystemFileDataSources(
167
- ctx.appPath, ctx.systemParsed, ctx.datasourceFiles, ctx.systemKey, ctx.dryRun, ctx.changes
168
- );
169
- const authVarsRemoved = removeAuthVarsFromConfiguration(
170
- ctx.systemParsed, ctx.systemKey, ctx.dryRun, ctx.changes
171
- );
172
- const systemFileUpdated =
173
- authReplaced || systemAuthConfigNormalized || systemDataSourcesAligned || authVarsRemoved;
174
- if (systemFileUpdated && !ctx.dryRun) {
175
- backupIntegrationFile(ctx.systemFilePath, bc);
176
- writeConfigFile(ctx.systemFilePath, ctx.systemParsed);
177
- }
178
- updated = updated || systemFileUpdated;
179
- const appKeyFixed = alignAppKeyWithSystem(
180
- ctx.variables, ctx.systemKey, ctx.systemParsed, ctx.changes
181
- );
182
- const datasourceKeysFixed = alignDatasourceSystemKeys(
183
- ctx.appPath, ctx.datasourceFiles, ctx.systemKey, ctx.dryRun, ctx.changes, bc
184
- );
185
- const rbacFileCreated = createRbacFromSystemIfNeeded({
186
- appPath: ctx.appPath,
187
- systemFilePath: ctx.systemFilePath,
188
- systemParsed: ctx.systemParsed,
189
- dryRun: ctx.dryRun,
190
- changes: ctx.changes,
191
- format: ctx.format,
192
- backupCtx: bc
193
- });
194
- const envTemplateRepaired = repairEnvTemplate(
195
- ctx.appPath, ctx.systemParsed, ctx.systemKey, ctx.dryRun, ctx.changes, bc
196
- );
197
- updated = updated || appKeyFixed || datasourceKeysFixed || rbacFileCreated || envTemplateRepaired;
198
- return {
199
- updated,
200
- appKeyFixed,
201
- datasourceKeysFixed,
202
- rbacFileCreated,
203
- envTemplateRepaired
204
- };
205
- }
206
-
207
- /**
208
- * Repairs external integration config: syncs files, aligns keys, creates rbac, regenerates manifest
209
- * @async
210
- * @param {string} appName - Application/integration name
211
- * @param {Object} [options] - Options
212
- * @param {boolean} [options.dryRun] - If true, only report changes; do not write
213
- * @param {boolean} [options.doc] - If true, regenerate README.md from deployment manifest
214
- * @returns {Promise<{ updated: boolean, changes: string[], systemFiles: string[], datasourceFiles: string[], appKeyFixed?: boolean, datasourceKeysFixed?: boolean, rbacFileCreated?: boolean, envTemplateRepaired?: boolean, manifestRegenerated?: boolean, readmeRegenerated?: boolean }>}
215
- */
216
22
  /**
217
23
  * Loads application config and discovers integration files; validates at least one system file exists.
218
24
  * @param {string} appPath - Application path
@@ -226,43 +32,13 @@ function loadConfigAndDiscover(appPath, configPath) {
226
32
  originalYamlContent = fs.readFileSync(configPath, 'utf8');
227
33
  }
228
34
  const { systemFiles, datasourceFiles: discoveredDatasourceFiles } = discoverIntegrationFiles(appPath);
229
- if (systemFiles.length === 0) {
35
+ if (!systemFiles || systemFiles.length === 0) {
230
36
  throw new Error(`No system file found in ${appPath}. Expected *-system.yaml or *-system.json`);
231
37
  }
232
38
  const datasourceFiles = buildEffectiveDatasourceFiles(appPath, discoveredDatasourceFiles, variables.externalIntegration?.dataSources);
233
39
  return { variables, originalYamlContent, systemFiles, datasourceFiles };
234
40
  }
235
41
 
236
- /**
237
- * Builds the repair result object from steps and flags.
238
- * @param {Object} steps - Result of runRepairSteps
239
- * @param {boolean} anyUpdated - Whether any repair made changes
240
- * @param {boolean} manifestRegenerated - Whether manifest was regenerated
241
- * @param {boolean} readmeRegenerated - Whether README was regenerated
242
- * @param {{ changes: string[], systemFiles: string[], datasourceFiles: string[] }} ctx - changes and file lists
243
- * @returns {Object} Combined result object
244
- */
245
- function buildRepairResult(steps, anyUpdated, manifestRegenerated, readmeRegenerated, ctx) {
246
- return Object.assign(
247
- {
248
- updated: anyUpdated,
249
- actionsPerformed: ctx.actionsPerformed === true,
250
- changes: ctx.changes,
251
- systemFiles: ctx.systemFiles,
252
- datasourceFiles: ctx.datasourceFiles,
253
- backupPaths: ctx.backupPaths || []
254
- },
255
- {
256
- appKeyFixed: steps.appKeyFixed,
257
- datasourceKeysFixed: steps.datasourceKeysFixed,
258
- rbacFileCreated: steps.rbacFileCreated,
259
- envTemplateRepaired: steps.envTemplateRepaired,
260
- manifestRegenerated,
261
- readmeRegenerated
262
- }
263
- );
264
- }
265
-
266
42
  /**
267
43
  * Validates repair inputs and resolves app path and config path.
268
44
  * @param {string} appName - Application name
@@ -291,83 +67,40 @@ function createRepairBackupContext(options, dryRun) {
291
67
  const noBackup = options.noBackup === true || options.backup === false;
292
68
  const backupPaths = [];
293
69
  const backedUpFiles = new Set();
294
- const backupCtx = { dryRun, noBackup, backupPaths, backedUpFiles };
70
+ const backupCtx = {
71
+ dryRun,
72
+ noBackup,
73
+ backupPaths,
74
+ backedUpFiles,
75
+ changedFiles: [],
76
+ wouldChangeFiles: []
77
+ };
295
78
  return { backupPaths, backupCtx };
296
79
  }
297
80
 
298
- async function maybeRunOpenApiSyncForMcp({ options, dryRun, appPath, systemKey, datasourceFiles, changes }) {
299
- if (!options.api) return false;
300
- try {
301
- const openapiLines = await maybeSyncOpenApiFilesForMcp({
302
- enabled: true,
303
- dryRun,
304
- appPath,
305
- systemKey,
306
- datasourceFiles
307
- });
308
- openapiLines.forEach((l) => changes.push(l));
309
- return openapiLines.length > 0;
310
- } catch (err) {
311
- changes.push(`OpenAPI upload for MCP failed: ${err.message}`);
312
- return false;
313
- }
314
- }
315
-
81
+ /**
82
+ * Repairs external integration config: syncs files, aligns keys, creates rbac, regenerates manifest
83
+ * @async
84
+ * @param {string} appName - Application/integration name
85
+ * @param {Object} [options] - Options
86
+ * @param {boolean} [options.dryRun] - If true, only report changes; do not write
87
+ * @param {boolean} [options.doc] - If true, regenerate README.md from deployment manifest
88
+ * @returns {Promise<Object>}
89
+ */
316
90
  async function repairExternalIntegration(appName, options = {}) {
317
91
  const { appPath, configPath, dryRun, authOption } = await validateAndResolveRepairPaths(appName, options);
318
92
  const { backupPaths, backupCtx } = createRepairBackupContext(options, dryRun);
319
- const { variables, originalYamlContent, systemFiles, datasourceFiles: initialDatasourceFiles } = loadConfigAndDiscover(appPath, configPath);
320
- const changes = [];
321
- const { systemFilePath, systemParsed, systemKey } = resolveSystemContext(appPath, systemFiles);
322
- const rbacFmt = options.format === 'json' ? 'json' : 'yaml';
323
- const { updated: keysNormalized, datasourceFiles } = normalizeDatasourceKeysAndFilenames(appPath, initialDatasourceFiles, systemKey, { variables, dryRun, changes, backupCtx });
324
- const steps = runRepairSteps({
93
+ const loaded = loadConfigAndDiscover(appPath, configPath);
94
+ return runRepairExternalIntegration({
95
+ appName,
96
+ options,
325
97
  appPath,
326
98
  configPath,
327
- variables,
328
- systemFilePath,
329
- systemParsed,
330
- systemKey,
331
- systemFiles,
332
- datasourceFiles,
333
- dryRun,
334
- changes,
335
- auth: authOption,
336
- format: rbacFmt,
337
- backupCtx
338
- });
339
- const datasourceRepairUpdated = runDatasourceRepairs(appPath, datasourceFiles, {
340
- expose: Boolean(options.expose),
341
- sync: Boolean(options.sync),
342
- test: Boolean(options.test),
343
- backupCtx
344
- }, dryRun, changes);
345
- const openapiActionsPerformed = await maybeRunOpenApiSyncForMcp({
346
- options,
347
99
  dryRun,
348
- appPath,
349
- systemKey,
350
- datasourceFiles,
351
- changes
352
- });
353
- const { rbacMigratedFromSystem, rbacMergeUpdated } = maybeRepairRbac(
354
- appPath,
355
- systemFilePath,
356
- systemParsed,
357
- datasourceFiles,
358
- { rbac: Boolean(options.rbac), rbacFmt, dryRun, changes, backupCtx }
359
- );
360
- const anyLocalUpdated = keysNormalized || steps.updated || datasourceRepairUpdated || rbacMigratedFromSystem || rbacMergeUpdated;
361
- const manifestRegenerated = (anyLocalUpdated && !dryRun) ? await persistChangesAndRegenerate(
362
- { configPath, variables, appName, appPath, changes, originalYamlContent, backupCtx }
363
- ) : false;
364
- const readmeRegenerated = await regenerateReadmeIfRequested(appName, appPath, { ...options, backupCtx }, changes);
365
- return buildRepairResult(steps, anyLocalUpdated, manifestRegenerated, readmeRegenerated, {
366
- actionsPerformed: openapiActionsPerformed,
367
- changes,
368
- systemFiles,
369
- datasourceFiles,
370
- backupPaths
100
+ authOption,
101
+ backupPaths,
102
+ backupCtx,
103
+ ...loaded
371
104
  });
372
105
  }
373
106