@aifabrix/builder 2.43.0 → 2.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/.cursor/rules/anchor-docs.mdc +15 -0
  2. package/.cursor/rules/cli-layout.mdc +75 -0
  3. package/.cursor/rules/project-rules.mdc +8 -0
  4. package/.npmrc.token +1 -0
  5. package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  6. package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  7. package/.nyc_output/processinfo/index.json +1 -0
  8. package/README.md +1 -1
  9. package/anchor-docs/README.md +10 -0
  10. package/anchor-docs/_TEMPLATE +24 -0
  11. package/bin/aifabrix.js +13 -4
  12. package/integration/hubspot-test/README.md +31 -0
  13. package/integration/hubspot-test/create-hubspot.js +5 -5
  14. package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
  15. package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
  16. package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
  17. package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
  18. package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
  19. package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
  20. package/integration/hubspot-test/test-dataplane-down.js +3 -3
  21. package/integration/hubspot-test/test.js +35 -43
  22. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
  23. package/integration/roundtrip-test-local/README.md +144 -0
  24. package/integration/roundtrip-test-local/application.yaml +13 -0
  25. package/integration/roundtrip-test-local/env.template +15 -0
  26. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
  27. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
  28. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
  29. package/integration/roundtrip-test-local2/README.md +144 -0
  30. package/integration/roundtrip-test-local2/application.yaml +13 -0
  31. package/integration/roundtrip-test-local2/env.template +15 -0
  32. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
  33. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
  34. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
  35. package/integration/test/wizard.yaml +8 -0
  36. package/jest.config.default.js +10 -0
  37. package/jest.config.integration.fixtures.js +22 -0
  38. package/jest.config.integration.js +21 -18
  39. package/jest.config.isolated.js +10 -0
  40. package/jest.projects.js +301 -0
  41. package/lib/api/certificates.api.js +62 -0
  42. package/lib/api/datasources-core.api.js +3 -3
  43. package/lib/api/dev-mtls-request.js +110 -0
  44. package/lib/api/dev-server-https.js +145 -0
  45. package/lib/api/dev.api.js +133 -144
  46. package/lib/api/index.js +11 -3
  47. package/lib/api/pipeline.api.js +67 -20
  48. package/lib/api/types/certificates.types.js +48 -0
  49. package/lib/api/types/dev.types.js +4 -3
  50. package/lib/api/types/pipeline.types.js +8 -5
  51. package/lib/api/types/validation-run.types.js +56 -0
  52. package/lib/api/validation-run.api.js +111 -0
  53. package/lib/api/validation-runner.js +109 -0
  54. package/lib/app/certification-show-enrich.js +129 -0
  55. package/lib/app/certification-verify-rows.js +60 -0
  56. package/lib/app/config.js +1 -1
  57. package/lib/app/deploy-status-display.js +2 -2
  58. package/lib/app/deploy.js +7 -6
  59. package/lib/app/display.js +2 -1
  60. package/lib/app/dockerfile.js +3 -2
  61. package/lib/app/down.js +2 -1
  62. package/lib/app/helpers.js +6 -5
  63. package/lib/app/index.js +27 -8
  64. package/lib/app/list.js +7 -6
  65. package/lib/app/push.js +4 -3
  66. package/lib/app/register.js +16 -7
  67. package/lib/app/rotate-secret.js +14 -13
  68. package/lib/app/run-container-start.js +184 -0
  69. package/lib/app/run-docker-fallback.js +108 -0
  70. package/lib/app/run-env-compose.js +30 -42
  71. package/lib/app/run-helpers.js +49 -126
  72. package/lib/app/run-infra-requirements.js +30 -0
  73. package/lib/app/run-resolve-image.js +21 -0
  74. package/lib/app/run.js +74 -21
  75. package/lib/app/show-display.js +44 -1
  76. package/lib/app/show.js +93 -9
  77. package/lib/build/index.js +13 -10
  78. package/lib/certification/cli-cert-sync-skip.js +21 -0
  79. package/lib/certification/merge-certification-from-artifact.js +185 -0
  80. package/lib/certification/post-unified-cert-sync.js +33 -0
  81. package/lib/certification/sync-after-external-command.js +52 -0
  82. package/lib/certification/sync-system-certification.js +197 -0
  83. package/lib/cli/index.js +2 -0
  84. package/lib/cli/setup-app.help.js +67 -0
  85. package/lib/cli/setup-app.js +61 -121
  86. package/lib/cli/setup-app.test-commands.js +195 -0
  87. package/lib/cli/setup-auth.js +19 -5
  88. package/lib/cli/setup-credential-deployment.js +22 -8
  89. package/lib/cli/setup-dev-path-commands.js +124 -0
  90. package/lib/cli/setup-dev.js +170 -113
  91. package/lib/cli/setup-environment.js +7 -1
  92. package/lib/cli/setup-external-system.js +84 -23
  93. package/lib/cli/setup-infra.js +126 -47
  94. package/lib/cli/setup-parameters.js +32 -0
  95. package/lib/cli/setup-secrets.js +137 -18
  96. package/lib/cli/setup-service-user.js +1 -1
  97. package/lib/cli/setup-utility.js +54 -22
  98. package/lib/commands/app-down.js +5 -7
  99. package/lib/commands/app-install.js +14 -7
  100. package/lib/commands/app-logs.js +13 -10
  101. package/lib/commands/app-shell.js +4 -1
  102. package/lib/commands/app-test.js +25 -19
  103. package/lib/commands/app.js +32 -11
  104. package/lib/commands/auth-config.js +6 -6
  105. package/lib/commands/auth-status.js +4 -3
  106. package/lib/commands/credential-env.js +4 -3
  107. package/lib/commands/credential-list.js +5 -4
  108. package/lib/commands/credential-push.js +4 -3
  109. package/lib/commands/datasource-unified-test-cli.js +428 -0
  110. package/lib/commands/datasource-unified-test-cli.options.js +191 -0
  111. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
  112. package/lib/commands/datasource-validation-cli.js +143 -0
  113. package/lib/commands/datasource.js +125 -95
  114. package/lib/commands/deployment-list.js +6 -5
  115. package/lib/commands/dev-cli-handlers.js +122 -18
  116. package/lib/commands/dev-down.js +4 -3
  117. package/lib/commands/dev-init.js +231 -116
  118. package/lib/commands/dev-show-display.js +473 -0
  119. package/lib/commands/login-credentials.js +3 -2
  120. package/lib/commands/login-device.js +4 -3
  121. package/lib/commands/login.js +5 -4
  122. package/lib/commands/logout.js +8 -7
  123. package/lib/commands/parameters-validate.js +54 -0
  124. package/lib/commands/repair-datasource.js +314 -68
  125. package/lib/commands/repair-env-template.js +2 -2
  126. package/lib/commands/repair.js +21 -3
  127. package/lib/commands/secrets-list.js +23 -12
  128. package/lib/commands/secrets-remove-all.js +220 -0
  129. package/lib/commands/secrets-remove.js +21 -12
  130. package/lib/commands/secrets-set.js +21 -12
  131. package/lib/commands/secrets-validate.js +4 -4
  132. package/lib/commands/secure.js +10 -9
  133. package/lib/commands/service-user.js +26 -25
  134. package/lib/commands/test-e2e-external.js +27 -1
  135. package/lib/commands/up-common.js +3 -2
  136. package/lib/commands/up-dataplane.js +29 -16
  137. package/lib/commands/up-miso.js +19 -29
  138. package/lib/commands/upload.js +149 -39
  139. package/lib/commands/wizard-core-helpers.js +1 -1
  140. package/lib/commands/wizard-dataplane.js +4 -3
  141. package/lib/commands/wizard-helpers.js +3 -3
  142. package/lib/commands/wizard.js +2 -2
  143. package/lib/core/admin-secrets.js +14 -5
  144. package/lib/core/audit-logger.js +12 -4
  145. package/lib/core/config-attach-extensions.js +46 -0
  146. package/lib/core/config-runtime-paths.js +29 -0
  147. package/lib/core/config.js +55 -56
  148. package/lib/core/diff.js +3 -2
  149. package/lib/core/ensure-encryption-key.js +1 -1
  150. package/lib/core/secrets-ensure-infra.js +77 -0
  151. package/lib/core/secrets-ensure.js +120 -64
  152. package/lib/core/secrets-env-write.js +35 -7
  153. package/lib/core/secrets-infra-placeholder-sync.js +61 -0
  154. package/lib/core/secrets.js +200 -37
  155. package/lib/core/templates-env.js +4 -3
  156. package/lib/datasource/abac-validator.js +1 -10
  157. package/lib/datasource/deploy.js +75 -53
  158. package/lib/datasource/field-reference-validator.js +9 -6
  159. package/lib/datasource/integration-context.js +63 -0
  160. package/lib/datasource/list.js +8 -7
  161. package/lib/datasource/log-viewer.js +189 -67
  162. package/lib/datasource/resolve-app.js +4 -4
  163. package/lib/datasource/test-e2e.js +113 -146
  164. package/lib/datasource/test-integration.js +114 -122
  165. package/lib/datasource/unified-validation-run-body.js +68 -0
  166. package/lib/datasource/unified-validation-run-post.js +23 -0
  167. package/lib/datasource/unified-validation-run-resolve.js +43 -0
  168. package/lib/datasource/unified-validation-run.js +93 -0
  169. package/lib/datasource/validate.js +157 -13
  170. package/lib/deployment/deployer.js +4 -3
  171. package/lib/deployment/environment.js +7 -6
  172. package/lib/deployment/push.js +17 -8
  173. package/lib/external-system/delete.js +4 -3
  174. package/lib/external-system/deploy.js +166 -53
  175. package/lib/external-system/download-helpers.js +1 -1
  176. package/lib/external-system/download.js +7 -6
  177. package/lib/external-system/generator.js +92 -6
  178. package/lib/external-system/integration-test-dispatch.js +26 -0
  179. package/lib/external-system/test-execution.js +5 -1
  180. package/lib/external-system/test-helpers.js +0 -4
  181. package/lib/external-system/test-system-level-helpers.js +110 -0
  182. package/lib/external-system/test-system-level.js +83 -44
  183. package/lib/external-system/test.js +59 -8
  184. package/lib/generator/builders.js +23 -11
  185. package/lib/generator/deploy-manifest-azure-kv.js +81 -0
  186. package/lib/generator/external.js +16 -4
  187. package/lib/generator/helpers.js +58 -3
  188. package/lib/generator/index.js +4 -0
  189. package/lib/generator/split-readme.js +12 -7
  190. package/lib/generator/split-variables.js +2 -1
  191. package/lib/generator/split.js +1 -1
  192. package/lib/generator/wizard-readme.js +3 -3
  193. package/lib/generator/wizard.js +8 -8
  194. package/lib/infrastructure/compose.js +70 -7
  195. package/lib/infrastructure/helpers-docker-check.js +67 -0
  196. package/lib/infrastructure/helpers.js +203 -42
  197. package/lib/infrastructure/index.js +31 -18
  198. package/lib/infrastructure/services.js +21 -67
  199. package/lib/internal/fs-real-sync.js +104 -0
  200. package/lib/internal/node-fs.js +98 -0
  201. package/lib/parameters/database-secret-values.js +173 -0
  202. package/lib/parameters/infra-kv-discovery.js +121 -0
  203. package/lib/parameters/infra-parameter-catalog.js +458 -0
  204. package/lib/parameters/infra-parameter-validate.js +64 -0
  205. package/lib/schema/application-schema.json +37 -17
  206. package/lib/schema/datasource-test-run.schema.json +493 -0
  207. package/lib/schema/deployment-rules.yaml +102 -63
  208. package/lib/schema/external-datasource.schema.json +1200 -442
  209. package/lib/schema/external-system.schema.json +203 -5
  210. package/lib/schema/flag-map-validation-run.json +31 -0
  211. package/lib/schema/infra-parameter.schema.json +106 -0
  212. package/lib/schema/infra.parameter.yaml +421 -0
  213. package/lib/schema/type/credential-auth-templates.json +40 -0
  214. package/lib/schema/type/document-storage.json +226 -0
  215. package/lib/schema/type/message-service.json +123 -0
  216. package/lib/schema/type/vector-store.json +88 -0
  217. package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
  218. package/lib/utils/api-error-handler.js +2 -2
  219. package/lib/utils/api.js +77 -17
  220. package/lib/utils/app-register-api.js +3 -2
  221. package/lib/utils/app-register-auth.js +1 -1
  222. package/lib/utils/app-register-config.js +4 -4
  223. package/lib/utils/app-register-display.js +3 -2
  224. package/lib/utils/app-register-validator.js +3 -2
  225. package/lib/utils/app-run-containers.js +26 -22
  226. package/lib/utils/app-scoped-config.js +31 -0
  227. package/lib/utils/app-service-env-from-builder.js +164 -0
  228. package/lib/utils/build-copy.js +1 -1
  229. package/lib/utils/build-helpers.js +20 -20
  230. package/lib/utils/build-resolve-image.js +165 -0
  231. package/lib/utils/cli-layout-chalk.js +8 -0
  232. package/lib/utils/cli-test-layout-chalk.js +267 -0
  233. package/lib/utils/cli-utils.js +88 -11
  234. package/lib/utils/compose-db-passwords.js +138 -0
  235. package/lib/utils/compose-generate-docker-compose.js +216 -0
  236. package/lib/utils/compose-generator.js +197 -291
  237. package/lib/utils/compose-miso-env.js +18 -0
  238. package/lib/utils/compose-traefik-ingress-base.js +158 -0
  239. package/lib/utils/config-paths.js +166 -7
  240. package/lib/utils/config-scoped-resources-preference.js +41 -0
  241. package/lib/utils/configuration-env-resolver.js +11 -8
  242. package/lib/utils/controller-deployment-outcome.js +68 -0
  243. package/lib/utils/credential-display.js +2 -2
  244. package/lib/utils/credential-secrets-env.js +5 -5
  245. package/lib/utils/dataplane-pipeline-warning.js +4 -3
  246. package/lib/utils/datasource-test-run-capability-scope.js +43 -0
  247. package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
  248. package/lib/utils/datasource-test-run-debug-display.js +137 -0
  249. package/lib/utils/datasource-test-run-debug-slice.js +93 -0
  250. package/lib/utils/datasource-test-run-display.js +459 -0
  251. package/lib/utils/datasource-test-run-exit.js +83 -0
  252. package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
  253. package/lib/utils/datasource-test-run-report-version.js +51 -0
  254. package/lib/utils/datasource-test-run-schema-sync.js +59 -0
  255. package/lib/utils/datasource-test-run-tty-log.js +81 -0
  256. package/lib/utils/datasource-validation-watch.js +266 -0
  257. package/lib/utils/declarative-url-ports.js +47 -0
  258. package/lib/utils/derive-env-key-from-client-id.js +41 -0
  259. package/lib/utils/dev-ca-install.js +185 -23
  260. package/lib/utils/dev-cert-helper.js +266 -17
  261. package/lib/utils/dev-hosts-helper.js +307 -0
  262. package/lib/utils/dev-init-cert-hints.js +37 -0
  263. package/lib/utils/dev-init-health-messages.js +52 -0
  264. package/lib/utils/dev-init-resolve.js +86 -0
  265. package/lib/utils/dev-init-ssh-merge.js +65 -0
  266. package/lib/utils/dev-ssh-config-helper.js +196 -0
  267. package/lib/utils/dev-user-groups.js +93 -0
  268. package/lib/utils/docker-build.js +42 -17
  269. package/lib/utils/docker-exec.js +28 -0
  270. package/lib/utils/docker-manifest-public-port.js +116 -0
  271. package/lib/utils/docker-not-running-hint.js +52 -0
  272. package/lib/utils/docker.js +98 -11
  273. package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
  274. package/lib/utils/env-config-loader.js +10 -91
  275. package/lib/utils/env-copy.js +19 -10
  276. package/lib/utils/env-map.js +35 -8
  277. package/lib/utils/env-template.js +2 -2
  278. package/lib/utils/environment-scoped-resources.js +144 -0
  279. package/lib/utils/error-formatter.js +92 -13
  280. package/lib/utils/error-formatters/http-status-errors.js +6 -5
  281. package/lib/utils/error-formatters/network-errors.js +2 -1
  282. package/lib/utils/error-formatters/permission-errors.js +2 -1
  283. package/lib/utils/error-formatters/validation-errors.js +2 -1
  284. package/lib/utils/external-readme.js +8 -1
  285. package/lib/utils/external-system-display.js +242 -136
  286. package/lib/utils/external-system-local-test-tty.js +389 -0
  287. package/lib/utils/external-system-readiness-core.js +377 -0
  288. package/lib/utils/external-system-readiness-deploy-display.js +270 -0
  289. package/lib/utils/external-system-readiness-display-internals.js +150 -0
  290. package/lib/utils/external-system-readiness-display.js +186 -0
  291. package/lib/utils/external-system-system-test-tty-overview.js +120 -0
  292. package/lib/utils/external-system-system-test-tty.js +417 -0
  293. package/lib/utils/external-system-test-helpers.js +24 -6
  294. package/lib/utils/external-system-validators.js +30 -12
  295. package/lib/utils/health-check-url.js +119 -0
  296. package/lib/utils/health-check.js +59 -25
  297. package/lib/utils/help-builder.js +11 -8
  298. package/lib/utils/image-version.js +4 -8
  299. package/lib/utils/infra-containers.js +4 -7
  300. package/lib/utils/infra-env-defaults.js +162 -0
  301. package/lib/utils/infra-status-display.js +167 -0
  302. package/lib/utils/infra-status.js +16 -8
  303. package/lib/utils/local-secrets.js +3 -4
  304. package/lib/utils/paths.js +148 -47
  305. package/lib/utils/port-resolver.js +10 -23
  306. package/lib/utils/redis-env-scope.js +62 -0
  307. package/lib/utils/register-aifabrix-shell-env.js +204 -0
  308. package/lib/utils/remote-builder-validation.js +99 -0
  309. package/lib/utils/remote-dev-auth.js +117 -21
  310. package/lib/utils/remote-docker-env.js +67 -15
  311. package/lib/utils/remote-secrets-loader.js +13 -4
  312. package/lib/utils/resolve-docker-image-ref.js +124 -0
  313. package/lib/utils/schema-loader.js +22 -9
  314. package/lib/utils/secrets-bash-kv.js +25 -0
  315. package/lib/utils/secrets-generator.js +169 -49
  316. package/lib/utils/secrets-helpers.js +70 -59
  317. package/lib/utils/secrets-kv-scope.js +60 -0
  318. package/lib/utils/secrets-utils.js +32 -38
  319. package/lib/utils/secrets-validation.js +3 -1
  320. package/lib/utils/secrets-yaml-preserve.js +109 -0
  321. package/lib/utils/ssh-key-helper.js +4 -2
  322. package/lib/utils/template-helpers.js +2 -2
  323. package/lib/utils/test-log-writer.js +3 -3
  324. package/lib/utils/token-manager.js +1 -2
  325. package/lib/utils/url-declarative-public-base.js +188 -0
  326. package/lib/utils/url-declarative-resolve-build.js +493 -0
  327. package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
  328. package/lib/utils/url-declarative-resolve.js +220 -0
  329. package/lib/utils/url-declarative-token-parse.js +74 -0
  330. package/lib/utils/url-declarative-url-flags.js +50 -0
  331. package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
  332. package/lib/utils/url-public-path-prefix.js +34 -0
  333. package/lib/utils/urls-local-registry.js +220 -0
  334. package/lib/utils/validation-report-tty-kit.js +77 -0
  335. package/lib/utils/validation-run-poll.js +112 -0
  336. package/lib/utils/validation-run-post-retry.js +85 -0
  337. package/lib/utils/validation-run-request.js +116 -0
  338. package/lib/utils/variable-transformer.js +21 -4
  339. package/lib/utils/yaml-preserve.js +33 -14
  340. package/lib/validation/datasource-warnings.js +56 -0
  341. package/lib/validation/env-template-auth.js +1 -1
  342. package/lib/validation/external-manifest-validator.js +27 -7
  343. package/lib/validation/validate-display.js +37 -31
  344. package/lib/validation/validate-external-cert-sync.js +23 -0
  345. package/lib/validation/validate.js +8 -14
  346. package/lib/validation/validator-unresolved-placeholders.js +98 -0
  347. package/lib/validation/validator.js +22 -65
  348. package/lib/validation/wizard-config-validator.js +2 -1
  349. package/package.json +9 -4
  350. package/scripts/check-datasource-test-run-schema-sync.js +34 -0
  351. package/scripts/diagnose-cli.js +150 -0
  352. package/scripts/install-local.js +307 -55
  353. package/scripts/pnpm-global-remove.js +48 -0
  354. package/templates/README.md +15 -2
  355. package/templates/applications/dataplane/application.yaml +52 -2
  356. package/templates/applications/dataplane/env.template +79 -17
  357. package/templates/applications/dataplane/rbac.yaml +8 -0
  358. package/templates/applications/keycloak/application.yaml +9 -1
  359. package/templates/applications/keycloak/env.template +15 -6
  360. package/templates/applications/miso-controller/application.yaml +10 -2
  361. package/templates/applications/miso-controller/env.template +42 -12
  362. package/templates/applications/miso-controller/rbac.yaml +5 -0
  363. package/templates/external-system/README.md.hbs +20 -7
  364. package/templates/external-system/deploy.js.hbs +5 -5
  365. package/templates/external-system/external-datasource.yaml.hbs +197 -118
  366. package/templates/infra/compose.yaml.hbs +33 -16
  367. package/templates/infra/servers.json.hbs +3 -1
  368. package/templates/python/docker-compose.hbs +16 -0
  369. package/templates/typescript/docker-compose.hbs +16 -0
  370. package/lib/api/external-test.api.js +0 -111
  371. package/lib/schema/env-config.yaml +0 -60
@@ -1,3 +1,4 @@
1
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
1
2
  /**
2
3
  * AI Fabrix Builder - Application Registration Commands
3
4
  *
@@ -17,9 +18,20 @@ const { rotateSecret } = require('../app/rotate-secret');
17
18
  const { showApp } = require('../app/show');
18
19
  const { runAppDeploymentList } = require('./deployment-list');
19
20
 
21
+ const APP_HELP_AFTER = `
22
+ Subcommands:
23
+ register <appKey> Register app; get pipeline client id/secret
24
+ list Applications in current environment
25
+ rotate-secret <key> New ClientSecret (shown once)
26
+ show <key> From controller (like show --online)
27
+ deployment <key> Deployment history for app
28
+
29
+ Requires: aifabrix login
30
+ `;
31
+
20
32
  function setupAppRegisterCommand(app) {
21
33
  app.command('register <appKey>')
22
- .description('Register application and get pipeline credentials')
34
+ .description('Register app; receive pipeline credentials')
23
35
  .option('-p, --port <port>', 'Application port (default: from application.yaml)')
24
36
  .option('-u, --url <url>', 'Application URL. If omitted: app.url, deployment.dataplaneUrl or deployment.appUrl in application.yaml; else http://localhost:{port})')
25
37
  .option('-n, --name <name>', 'Override display name')
@@ -28,7 +40,7 @@ function setupAppRegisterCommand(app) {
28
40
  try {
29
41
  await registerApplication(appKey, options);
30
42
  } catch (error) {
31
- logger.error(chalk.red('Registration failed:'), error.message);
43
+ logger.error(formatBlockingError('Registration failed:'), error.message);
32
44
  process.exit(1);
33
45
  }
34
46
  });
@@ -36,12 +48,12 @@ function setupAppRegisterCommand(app) {
36
48
 
37
49
  function setupAppListCommand(app) {
38
50
  app.command('list')
39
- .description('List applications')
51
+ .description('List apps in current environment')
40
52
  .action(async(options) => {
41
53
  try {
42
54
  await listApplications(options);
43
55
  } catch (error) {
44
- logger.error(chalk.red('Failed to list applications:'), error.message);
56
+ logger.error(formatBlockingError('Failed to list applications:'), error.message);
45
57
  process.exit(1);
46
58
  }
47
59
  });
@@ -49,26 +61,35 @@ function setupAppListCommand(app) {
49
61
 
50
62
  function setupAppRotateSecretCommand(app) {
51
63
  app.command('rotate-secret <appKey>')
52
- .description('Rotate pipeline ClientSecret for an application')
64
+ .description('Rotate pipeline ClientSecret (one-time display)')
53
65
  .action(async(appKey, options) => {
54
66
  try {
55
67
  await rotateSecret(appKey, options);
56
68
  } catch (error) {
57
- logger.error(chalk.red('Rotation failed:'), error.message);
69
+ logger.error(formatBlockingError('Rotation failed:'), error.message);
58
70
  process.exit(1);
59
71
  }
60
72
  });
61
73
  }
62
74
 
63
75
  function setupAppShowCommand(app) {
64
- app.command('show <appKey>')
65
- .description('Show application from controller (online). Same as aifabrix show <appKey> --online')
76
+ app.command('show <app>')
77
+ .description('App details from controller (same as show --online)')
66
78
  .option('--online', 'Fetch from controller (default for this command)')
67
79
  .option('--json', 'Output as JSON')
68
80
  .option('--permissions', 'Show only list of permissions')
81
+ .option(
82
+ '--verify-cert',
83
+ 'For external integrations, verify trust state on the dataplane (requires login)'
84
+ )
69
85
  .action(async(appKey, options) => {
70
86
  try {
71
- await showApp(appKey, { online: true, json: !!options.json, permissions: !!options.permissions });
87
+ await showApp(appKey, {
88
+ online: true,
89
+ json: !!options.json,
90
+ permissions: !!options.permissions,
91
+ verifyCert: options.verifyCert === true
92
+ });
72
93
  } catch (error) {
73
94
  logger.error(chalk.red(`Error: ${error.message}`));
74
95
  process.exit(1);
@@ -78,7 +99,7 @@ function setupAppShowCommand(app) {
78
99
 
79
100
  function setupAppDeploymentCommand(app) {
80
101
  app.command('deployment <appKey>')
81
- .description('List last N deployments for an application in current environment (default pageSize=50)')
102
+ .description('List recent deployments for app in current environment')
82
103
  .option('--controller <url>', 'Controller URL (default: from config)')
83
104
  .option('--environment <env>', 'Environment key (default: from config)')
84
105
  .option('--page-size <n>', 'Items per page', '50')
@@ -102,7 +123,7 @@ function setupAppDeploymentCommand(app) {
102
123
  * @param {Command} program - Commander program instance
103
124
  */
104
125
  function setupAppCommands(program) {
105
- const app = program.command('app').description('Manage applications');
126
+ const app = program.command('app').description('Controller apps: register, list, secrets, deploy history').addHelpText('after', APP_HELP_AFTER);
106
127
  setupAppRegisterCommand(app);
107
128
  setupAppListCommand(app);
108
129
  setupAppRotateSecretCommand(app);
@@ -8,7 +8,7 @@
8
8
  * @version 2.0.0
9
9
  */
10
10
 
11
- const chalk = require('chalk');
11
+ const { formatBlockingError, formatSuccessLine } = require('../utils/cli-test-layout-chalk');
12
12
  const {
13
13
  setControllerUrl,
14
14
  setCurrentEnvironment,
@@ -42,14 +42,14 @@ async function handleSetController(url) {
42
42
  if (!loggedInControllerUrl) {
43
43
  // No stored credentials: allow setting controller so "aifabrix login" opens the right place
44
44
  await setControllerUrl(url);
45
- logger.log(chalk.green(`✓ Controller URL set to: ${url}`));
45
+ logger.log(formatSuccessLine(`Controller URL set to: ${url}`));
46
46
  return;
47
47
  }
48
48
 
49
49
  const normalizedLoggedIn = loggedInControllerUrl.trim().replace(/\/+$/, '');
50
50
  if (normalizedLoggedIn === normalizedUrl) {
51
51
  await setControllerUrl(url);
52
- logger.log(chalk.green(`✓ Controller URL set to: ${url}`));
52
+ logger.log(formatSuccessLine(`Controller URL set to: ${url}`));
53
53
  return;
54
54
  }
55
55
 
@@ -58,7 +58,7 @@ async function handleSetController(url) {
58
58
  'To use a different controller either run "aifabrix login" with that controller, or run "aifabrix logout" first to clear credentials, then set the new controller with "aifabrix auth --set-controller <url>".'
59
59
  );
60
60
  } catch (error) {
61
- logger.error(chalk.red(`✗ Failed to set controller URL: ${error.message}`));
61
+ logger.error(formatBlockingError(`Failed to set controller URL: ${error.message}`));
62
62
  throw error;
63
63
  }
64
64
  }
@@ -95,9 +95,9 @@ async function handleSetEnvironment(environment) {
95
95
  // Save environment
96
96
  await setCurrentEnvironment(environment);
97
97
 
98
- logger.log(chalk.green(`✓ Environment set to: ${environment}`));
98
+ logger.log(formatSuccessLine(`Environment set to: ${environment}`));
99
99
  } catch (error) {
100
- logger.error(chalk.red(`✗ Failed to set environment: ${error.message}`));
100
+ logger.error(formatBlockingError(`Failed to set environment: ${error.message}`));
101
101
  throw error;
102
102
  }
103
103
  }
@@ -9,6 +9,7 @@
9
9
  */
10
10
 
11
11
  const chalk = require('chalk');
12
+ const { failureGlyph, successGlyph } = require('../utils/cli-test-layout-chalk');
12
13
  const logger = require('../utils/logger');
13
14
  const config = require('../core/config');
14
15
  const { getConfig } = config;
@@ -194,7 +195,7 @@ function displayUserInfo(user) {
194
195
  * @param {Object} tokenInfo - Token information
195
196
  */
196
197
  function displayTokenInfo(tokenInfo) {
197
- const statusIcon = tokenInfo.authenticated ? chalk.green('✓') : chalk.red('✗');
198
+ const statusIcon = tokenInfo.authenticated ? successGlyph() : failureGlyph();
198
199
  const statusText = tokenInfo.authenticated ? 'Authenticated' : 'Not authenticated';
199
200
 
200
201
  logger.log(` Status: ${statusIcon} ${statusText}`);
@@ -244,7 +245,7 @@ function displayDataplaneSection(dataplaneUrl, dataplaneConnected) {
244
245
  logger.log('');
245
246
  if (dataplaneUrl) {
246
247
  logger.log(`Dataplane: ${chalk.cyan(dataplaneUrl)}`);
247
- const statusIcon = dataplaneConnected ? chalk.green('✓') : chalk.red('✗');
248
+ const statusIcon = dataplaneConnected ? successGlyph() : failureGlyph();
248
249
  const statusText = dataplaneConnected ? 'Connected' : 'Not reachable';
249
250
  displayOpenApiDocs(null, dataplaneUrl);
250
251
  logger.log('');
@@ -297,7 +298,7 @@ function displayStatus(controllerUrl, environment, tokenInfo, dataplaneInfo) {
297
298
  logger.log(` Environment: ${chalk.cyan(environment || 'Not specified')}\n`);
298
299
 
299
300
  if (!tokenInfo) {
300
- logger.log(` Status: ${chalk.red('Not authenticated')}`);
301
+ logger.log(` Status: ${failureGlyph()} ${chalk.red('Not authenticated')}`);
301
302
  logger.log(` Token Type: ${chalk.gray('None')}\n`);
302
303
  logger.log(chalk.yellow('💡 Run "aifabrix login" to authenticate\n'));
303
304
  return;
@@ -1,6 +1,7 @@
1
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
1
2
  /**
2
3
  * Credential env command – prompts for KV_* values and writes .env.
3
- * Used by `aifabrix credential env <system-key>`.
4
+ * Used by `aifabrix credential env <systemKey>`.
4
5
  *
5
6
  * @fileoverview Credential env command – interactive credential capture to .env
6
7
  * @author AI Fabrix Team
@@ -120,7 +121,7 @@ function buildEnvContent(templateContent, promptValues) {
120
121
  /**
121
122
  * Runs credential env command: prompt for KV_* values and write .env.
122
123
  * @async
123
- * @param {string} systemKey - External system key (integration/<system-key>/)
124
+ * @param {string} systemKey - External system key (integration/<systemKey>/)
124
125
  * @returns {Promise<string>} Path to written .env file
125
126
  * @throws {Error} If env.template missing or write fails
126
127
  */
@@ -155,7 +156,7 @@ async function runCredentialEnv(systemKey) {
155
156
  const dir = path.dirname(envPath);
156
157
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
157
158
  fs.writeFileSync(envPath, content, { mode: 0o600 });
158
- logger.log(chalk.green(`✓ Wrote ${envPath}`));
159
+ logger.log(formatSuccessLine(`Wrote ${envPath}`));
159
160
  return envPath;
160
161
  }
161
162
 
@@ -1,3 +1,4 @@
1
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
1
2
  /**
2
3
  * Credential list command – list credentials from Dataplane
3
4
  * GET /api/v1/credential. Used by `aifabrix credential list`.
@@ -78,12 +79,12 @@ function displayCredentialList(list, baseUrl) {
78
79
  async function ensureControllerAndAuth(options = {}) {
79
80
  const controllerUrl = options.controller || (await resolveControllerUrl());
80
81
  if (!controllerUrl) {
81
- logger.error(chalk.red('Controller URL is required. Run "aifabrix login" first.'));
82
+ logger.error(formatBlockingError('Controller URL is required. Run "aifabrix login" first.'));
82
83
  process.exit(1);
83
84
  }
84
85
  const authResult = await getCredentialListAuth(controllerUrl);
85
86
  if (!authResult || !authResult.token) {
86
- logger.error(chalk.red(`❌ No authentication token for controller: ${controllerUrl}`));
87
+ logger.error(formatBlockingError(`No authentication token for controller: ${controllerUrl}`));
87
88
  logger.error(chalk.gray('Run: aifabrix login'));
88
89
  process.exit(1);
89
90
  }
@@ -129,7 +130,7 @@ async function resolveDataplaneUrlOrExit(controllerUrl, authConfig) {
129
130
  try {
130
131
  return await resolveCredentialListDataplaneUrl(controllerUrl, authConfig);
131
132
  } catch (err) {
132
- logger.error(chalk.red(`❌ Could not resolve Dataplane URL: ${err.message}`));
133
+ logger.error(formatBlockingError(`Could not resolve Dataplane URL: ${err.message}`));
133
134
  process.exit(1);
134
135
  }
135
136
  }
@@ -152,7 +153,7 @@ async function runCredentialList(options = {}) {
152
153
  try {
153
154
  await fetchAndDisplayCredentials(dataplaneUrl, authConfig, listOptions);
154
155
  } catch (error) {
155
- logger.error(chalk.red(`❌ Failed to list credentials: ${error.message}`));
156
+ logger.error(formatBlockingError(`Failed to list credentials: ${error.message}`));
156
157
  process.exit(1);
157
158
  }
158
159
  }
@@ -1,6 +1,7 @@
1
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
1
2
  /**
2
3
  * Credential push command – pushes KV_* from .env to dataplane.
3
- * Used by `aifabrix credential push <system-key>`.
4
+ * Used by `aifabrix credential push <systemKey>`.
4
5
  *
5
6
  * @fileoverview Credential push command – push credential secrets to dataplane
6
7
  * @author AI Fabrix Team
@@ -55,7 +56,7 @@ async function buildPayload(systemKey) {
55
56
  function logPushResult(pushResult) {
56
57
  if (pushResult.pushed > 0) {
57
58
  const keyList = pushResult.keys?.length ? ` (${pushResult.keys.join(', ')})` : '';
58
- logger.log(chalk.green(`✓ Pushed ${pushResult.pushed} credential secret(s) to dataplane${keyList}.`));
59
+ logger.log(formatSuccessLine(`Pushed ${pushResult.pushed} credential secret(s) to dataplane${keyList}.`));
59
60
  } else if (pushResult.skipped) {
60
61
  logger.log(chalk.yellow('No credential secrets to push (empty .env or no KV_* vars with values).'));
61
62
  } else {
@@ -75,7 +76,7 @@ async function runCredentialPush(systemKey) {
75
76
  const authConfig = await getDeploymentAuth(controllerUrl, environment, systemKey);
76
77
 
77
78
  if (!authConfig.token && !authConfig.clientId) {
78
- throw new Error('Authentication required. Run "aifabrix login" or "aifabrix app register <system-key>" first.');
79
+ throw new Error('Authentication required. Run "aifabrix login" or "aifabrix app register <systemKey>" first.');
79
80
  }
80
81
 
81
82
  requireBearerForDataplanePipeline(authConfig);