@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
@@ -0,0 +1,195 @@
1
+ /**
2
+ * @fileoverview CLI test/install/lint command setup (builder app + external integration dispatch).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const chalk = require('chalk');
8
+ const logger = require('../utils/logger');
9
+ const { handleCommandError } = require('../utils/cli-utils');
10
+ const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
11
+ const { TEST_HELP_AFTER, TEST_E2E_HELP_AFTER } = require('./setup-app.help');
12
+
13
+ function setupTestCommand(program) {
14
+ program.command('test <app>')
15
+ .description('Tests: builder in container; external = local validation')
16
+ .option('-e, --env <env>', 'For builder app: dev (running container) or tst (ephemeral)', 'dev')
17
+ .option('-v, --verbose', 'Verbose output')
18
+ .option('-d, --debug', 'Write debug log to integration/<systemKey>/logs/ (external only)')
19
+ .option(
20
+ '--sync',
21
+ 'Not supported for this command (local validation only). Use aifabrix upload <systemKey> or dataplane test commands with --sync.'
22
+ )
23
+ .addHelpText('after', TEST_HELP_AFTER)
24
+ .action(async(appName, options, cmd) => {
25
+ try {
26
+ const rawArgs = Array.isArray(cmd?.rawArgs) ? cmd.rawArgs : [];
27
+ const envExplicit = rawArgs.includes('-e') || rawArgs.includes('--env');
28
+ const pathsUtil = require('../utils/paths');
29
+ const appType = await pathsUtil.detectAppType(appName).catch(() => null);
30
+ if (options.sync === true) {
31
+ throw new Error(
32
+ 'Option --sync is not supported for aifabrix test (local or container runs do not publish to the dataplane). ' +
33
+ 'Use: aifabrix upload <systemKey>, then aifabrix test-integration <systemKey> --sync or aifabrix datasource test-integration <datasourceKey> --sync.'
34
+ );
35
+ }
36
+ if (appType && appType.baseDir === 'integration') {
37
+ const test = require('../external-system/test');
38
+ const externalOpts = {
39
+ ...options,
40
+ // Keep help default but don't override auth/env behavior unless user explicitly set it.
41
+ env: envExplicit ? options.env : undefined
42
+ };
43
+ const results = await test.testExternalSystem(appName, externalOpts);
44
+ test.displayTestResults(results, options.verbose, appName);
45
+ if (!results.valid) process.exit(1);
46
+ return;
47
+ }
48
+ const { runAppTest } = require('../commands/app-test');
49
+ await runAppTest(appName, { env: options.env });
50
+ } catch (error) {
51
+ handleCommandError(error, 'test');
52
+ process.exit(1);
53
+ }
54
+ });
55
+ }
56
+
57
+ async function runTestE2ECommand(appName, options) {
58
+ const pathsUtil = require('../utils/paths');
59
+ const appType = await pathsUtil.detectAppType(appName).catch(() => null);
60
+ if (options.sync === true && appType && appType.baseDir === 'builder') {
61
+ throw new Error(
62
+ 'Option --sync applies only to external integration E2E (integration/<systemKey>/). ' +
63
+ 'Remove --sync for builder app E2E, or use aifabrix upload from the integration folder first.'
64
+ );
65
+ }
66
+ if (appType && appType.baseDir === 'integration') {
67
+ const { runTestE2EForExternalSystem } = require('../commands/test-e2e-external');
68
+ const { success, results } = await runTestE2EForExternalSystem(appName, {
69
+ env: options.env,
70
+ debug: options.debug,
71
+ verbose: options.verbose,
72
+ async: options.async !== false,
73
+ sync: options.sync === true
74
+ });
75
+ const { displayIntegrationTestResults } = require('../utils/external-system-display');
76
+ const datasourceResults = results.map(r => ({
77
+ key: r.key,
78
+ success: r.success,
79
+ error: r.error,
80
+ skipped: false,
81
+ datasourceTestRun: r.datasourceTestRun
82
+ }));
83
+ displayIntegrationTestResults(
84
+ {
85
+ systemKey: appName,
86
+ success,
87
+ datasourceResults
88
+ },
89
+ options.verbose,
90
+ { debug: options.debug, runType: 'e2e' }
91
+ );
92
+ const { computeSystemExitCodeFromDatasourceRows } = require('../utils/datasource-test-run-exit');
93
+ const exitCode = computeSystemExitCodeFromDatasourceRows(datasourceResults, {
94
+ warningsAsErrors: options.warningsAsErrors === true,
95
+ requireCert: options.requireCert === true
96
+ });
97
+ if (exitCode !== 0) process.exit(exitCode);
98
+ if (cliOptsSkipCertSync(options)) return;
99
+ const { trySyncCertificationFromDataplaneForExternalApp } = require('../certification/sync-after-external-command');
100
+ await trySyncCertificationFromDataplaneForExternalApp(appName, 'test-e2e');
101
+ return;
102
+ }
103
+ const { runAppTestE2e } = require('../commands/app-test');
104
+ await runAppTestE2e(appName, { env: options.env });
105
+ }
106
+
107
+ function setupInstallCommand(program) {
108
+ program.command('install <app>')
109
+ .description('Install deps in container (builder apps only)')
110
+ .option('--env <env>', 'dev (running container) or tst (ephemeral with .env)', 'dev')
111
+ .action(async(appName, options) => {
112
+ try {
113
+ const pathsUtil = require('../utils/paths');
114
+ const appType = await pathsUtil.detectAppType(appName).catch(() => null);
115
+ if (appType && appType.baseDir === 'integration') {
116
+ logger.log(
117
+ chalk.gray('Install is for builder applications only. Use aifabrix shell <app> to run commands in external setups.')
118
+ );
119
+ return;
120
+ }
121
+ const { runAppInstall } = require('../commands/app-install');
122
+ await runAppInstall(appName, { env: options.env });
123
+ } catch (error) {
124
+ handleCommandError(error, 'install');
125
+ process.exit(1);
126
+ }
127
+ });
128
+ }
129
+
130
+ function setupTestE2eCommand(program) {
131
+ program.command('test-e2e <app>')
132
+ .description('E2E: builder in container; external = all datasources via dataplane')
133
+ .option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
134
+ .option('-v, --verbose', 'Show detailed step output and poll progress')
135
+ .option('-d, --debug', 'Include debug output and write log to integration/<systemKey>/logs/')
136
+ .option(
137
+ '--sync',
138
+ 'Publish local system and datasource files to the dataplane before running E2E (same as aifabrix upload <systemKey>; external integration only)'
139
+ )
140
+ .option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
141
+ .option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
142
+ .option(
143
+ '--no-cert-sync',
144
+ 'Skip updating the system file certification block from the dataplane after a successful run'
145
+ )
146
+ .addHelpText('after', TEST_E2E_HELP_AFTER)
147
+ .action(async(appName, options, cmd) => {
148
+ try {
149
+ const rawArgs = Array.isArray(cmd?.rawArgs) ? cmd.rawArgs : [];
150
+ const envExplicit = rawArgs.includes('-e') || rawArgs.includes('--env');
151
+ const externalOpts = {
152
+ ...options,
153
+ env: envExplicit ? options.env : undefined,
154
+ async: true // system-level command surface omits --no-async; always poll for completeness
155
+ };
156
+ await runTestE2ECommand(appName, externalOpts);
157
+ } catch (error) {
158
+ handleCommandError(error, 'test-e2e');
159
+ process.exit(1);
160
+ }
161
+ });
162
+ }
163
+
164
+ function setupLintCommand(program) {
165
+ program.command('lint <app>')
166
+ .description('Lint in container (builder apps only)')
167
+ .option('--env <env>', 'dev (running container) or tst (ephemeral with .env)', 'dev')
168
+ .action(async(appName, options) => {
169
+ try {
170
+ const pathsUtil = require('../utils/paths');
171
+ const appType = await pathsUtil.detectAppType(appName).catch(() => null);
172
+ if (appType && appType.baseDir === 'integration') {
173
+ logger.log(chalk.gray('lint is for builder applications only. Use aifabrix shell <app> then make lint or pnpm lint.'));
174
+ return;
175
+ }
176
+ const { runAppLint } = require('../commands/app-test');
177
+ await runAppLint(appName, { env: options.env });
178
+ } catch (error) {
179
+ handleCommandError(error, 'lint');
180
+ process.exit(1);
181
+ }
182
+ });
183
+ }
184
+
185
+ function setupInstallTestE2eLintCommands(program) {
186
+ setupInstallCommand(program);
187
+ setupTestCommand(program);
188
+ setupTestE2eCommand(program);
189
+ setupLintCommand(program);
190
+ }
191
+
192
+ module.exports = {
193
+ setupInstallTestE2eLintCommands
194
+ };
195
+
@@ -14,9 +14,22 @@ const { handleLogout } = require('../commands/logout');
14
14
  const { handleAuthStatus } = require('../commands/auth-status');
15
15
  const { handleAuthConfig } = require('../commands/auth-config');
16
16
 
17
+ const LOGIN_HELP_AFTER = `
18
+ Examples:
19
+ $ aifabrix login
20
+ $ aifabrix login -m credentials -a myapp -e dev
21
+ `;
22
+
23
+ const AUTH_HELP_AFTER = `
24
+ Without options: show auth status (same as: aifabrix auth status).
25
+ With --set-controller or --set-environment: write defaults to config.yaml.
26
+ Subcommand: auth status [--validate] for CI/scripts.
27
+ `;
28
+
17
29
  function setupLoginCommand(program) {
18
30
  program.command('login')
19
- .description('Authenticate with Miso Controller')
31
+ .description('Sign in to Miso Controller (device or credentials flow)')
32
+ .addHelpText('after', LOGIN_HELP_AFTER)
20
33
  .option('-c, --controller <url>', 'Controller URL (default: from config or developer ID, e.g. http://localhost:3000)')
21
34
  .option('-m, --method <method>', 'Authentication method (device|credentials)', 'device')
22
35
  .option('-a, --app <app>', 'Application name (required for credentials method, reads from secrets.local.yaml)')
@@ -29,7 +42,7 @@ function setupLoginCommand(program) {
29
42
  try {
30
43
  await handleLogin(options);
31
44
  } catch (error) {
32
- logger.error(chalk.red('\n Login failed:'), error.message);
45
+ logger.error(chalk.red('\n Login failed:'), error.message);
33
46
  process.exit(1);
34
47
  }
35
48
  });
@@ -37,7 +50,7 @@ function setupLoginCommand(program) {
37
50
 
38
51
  function setupLogoutCommand(program) {
39
52
  program.command('logout')
40
- .description('Clear authentication tokens')
53
+ .description('Clear stored tokens (optional filter by controller/env/app)')
41
54
  .option('-c, --controller <url>', 'Clear device tokens for specific controller')
42
55
  .option('-e, --environment <env>', 'Clear client tokens for specific environment')
43
56
  .option('-a, --app <app>', 'Clear client tokens for specific app (requires --environment)')
@@ -61,7 +74,8 @@ function setupAuthSubcommands(program) {
61
74
  }
62
75
  };
63
76
  const auth = program.command('auth')
64
- .description('Authentication status and config (controller, environment)')
77
+ .description('Show auth status or set default controller/environment')
78
+ .addHelpText('after', AUTH_HELP_AFTER)
65
79
  .option('--set-controller <url>', 'Set default controller URL in config')
66
80
  .option('--set-environment <env>', 'Set default environment in config')
67
81
  .action(async(options) => {
@@ -82,7 +96,7 @@ function setupAuthSubcommands(program) {
82
96
  }
83
97
  });
84
98
  auth.command('status')
85
- .description('Display authentication status for current controller and environment')
99
+ .description('Show tokens/session for current controller and environment')
86
100
  .option('--validate', 'Exit with code 1 when not authenticated (for scripted use, e.g. manual test setup)')
87
101
  .action(authStatusHandler);
88
102
  }
@@ -15,10 +15,22 @@ const { runCredentialEnv } = require('../commands/credential-env');
15
15
  const { runCredentialPush } = require('../commands/credential-push');
16
16
  const { runDeploymentList } = require('../commands/deployment-list');
17
17
 
18
+ const CREDENTIAL_HELP_AFTER = `
19
+ Subcommands:
20
+ env <systemKey> Prompt for KV_* values → integration/<key>/.env
21
+ push <systemKey> Upload secrets from .env to Dataplane
22
+ list List credentials (pagination: --page-size)
23
+ `;
24
+
25
+ const DEPLOYMENT_HELP_AFTER = `
26
+ Subcommand:
27
+ list Recent deployments for the current environment
28
+ `;
29
+
18
30
  function setupCredentialEnvAndPush(credential) {
19
31
  credential
20
- .command('env <system-key>')
21
- .description('Prompt for KV_* credential values and write integration/<system-key>/.env')
32
+ .command('env <systemKey>')
33
+ .description('Interactive KV_* prompts integration/<key>/.env')
22
34
  .action(async(systemKey, _options) => {
23
35
  try {
24
36
  await runCredentialEnv(systemKey);
@@ -29,8 +41,8 @@ function setupCredentialEnvAndPush(credential) {
29
41
  }
30
42
  });
31
43
  credential
32
- .command('push <system-key>')
33
- .description('Push credential secrets from .env to Dataplane (KV_* vars)')
44
+ .command('push <systemKey>')
45
+ .description('Push KV_* secrets from .env to Dataplane')
34
46
  .action(async(systemKey, _options) => {
35
47
  try {
36
48
  await runCredentialPush(systemKey);
@@ -49,11 +61,12 @@ function setupCredentialEnvAndPush(credential) {
49
61
  function setupCredentialDeploymentCommands(program) {
50
62
  const credential = program
51
63
  .command('credential')
52
- .description('Manage credentials');
64
+ .description('Dataplane credentials: env, push, list')
65
+ .addHelpText('after', CREDENTIAL_HELP_AFTER);
53
66
  setupCredentialEnvAndPush(credential);
54
67
  credential
55
68
  .command('list')
56
- .description('Get credentials from Dataplane')
69
+ .description('List credentials from Dataplane')
57
70
  .option('--active-only', 'List only active credentials')
58
71
  .option('--page-size <n>', 'Items per page', '50')
59
72
  .action(async(options) => {
@@ -72,11 +85,12 @@ function setupCredentialDeploymentCommands(program) {
72
85
 
73
86
  const deployment = program
74
87
  .command('deployment')
75
- .description('List deployments');
88
+ .description('Controller deployments (list)')
89
+ .addHelpText('after', DEPLOYMENT_HELP_AFTER);
76
90
 
77
91
  deployment
78
92
  .command('list')
79
- .description('List last N deployments for current environment (default pageSize=50)')
93
+ .description('List recent deployments for current environment')
80
94
  .option('--controller <url>', 'Controller URL (default: from config)')
81
95
  .option('--environment <env>', 'Environment key (default: from config)')
82
96
  .option('--page-size <n>', 'Items per page', '50')
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Dev subcommands: set-home, set-work, print-home, print-work, set-format.
3
+ *
4
+ * @fileoverview Path and format CLI registration for `aifabrix dev`
5
+ * @author AI Fabrix Team
6
+ * @version 2.0.0
7
+ */
8
+
9
+ 'use strict';
10
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
11
+
12
+ const chalk = require('chalk');
13
+ const config = require('../core/config');
14
+ const logger = require('../utils/logger');
15
+ const paths = require('../utils/paths');
16
+ const { registerAifabrixShellEnvFromConfig } = require('../utils/register-aifabrix-shell-env');
17
+ const { handleCommandError } = require('../utils/cli-utils');
18
+
19
+ async function runShellEnvRegistration() {
20
+ try {
21
+ await registerAifabrixShellEnvFromConfig(config.getConfig);
22
+ logger.log(
23
+ chalk.gray(' User/shell environment updated. Open a new terminal for AIFABRIX_HOME / AIFABRIX_WORK.')
24
+ );
25
+ } catch (regErr) {
26
+ throw new Error(`Config saved but environment registration failed: ${regErr.message}`);
27
+ }
28
+ }
29
+
30
+ function addSetHomeCommand(dev) {
31
+ dev
32
+ .command('set-home <path>')
33
+ .description('Set or clear aifabrix-home in config; register AIFABRIX_HOME for new shells unless --no-register-env')
34
+ .option('--no-register-env', 'Do not update Windows user env or POSIX shell profile hooks')
35
+ .action(async(homePath, cmdOpts) => {
36
+ try {
37
+ const trimmed = (homePath || '').trim();
38
+ await config.setAifabrixHomeOverride(trimmed);
39
+ logger.log(trimmed === '' ? formatSuccessLine('Home path cleared') : formatSuccessLine(`Home path set to ${trimmed}`));
40
+ if (cmdOpts?.registerEnv !== false) {
41
+ await runShellEnvRegistration();
42
+ }
43
+ } catch (error) {
44
+ handleCommandError(error, 'dev set-home');
45
+ process.exit(1);
46
+ }
47
+ });
48
+ }
49
+
50
+ function addSetWorkCommand(dev) {
51
+ dev
52
+ .command('set-work <path>')
53
+ .description('Set or clear aifabrix-work (workspace root) in config; register AIFABRIX_WORK unless --no-register-env')
54
+ .option('--no-register-env', 'Do not update Windows user env or POSIX shell profile hooks')
55
+ .action(async(workPath, cmdOpts) => {
56
+ try {
57
+ const trimmed = (workPath || '').trim();
58
+ await config.setAifabrixWorkOverride(trimmed);
59
+ logger.log(trimmed === '' ? formatSuccessLine('Work path cleared') : formatSuccessLine(`Work path set to ${trimmed}`));
60
+ if (cmdOpts?.registerEnv !== false) {
61
+ await runShellEnvRegistration();
62
+ }
63
+ } catch (error) {
64
+ handleCommandError(error, 'dev set-work');
65
+ process.exit(1);
66
+ }
67
+ });
68
+ }
69
+
70
+ function addPrintHomeWorkCommands(dev) {
71
+ dev
72
+ .command('print-home')
73
+ .description('Print resolved AIFABRIX_HOME path (stdout only; for scripts)')
74
+ .action(() => {
75
+ try {
76
+ process.stdout.write(`${paths.getAifabrixHome()}\n`);
77
+ } catch (error) {
78
+ handleCommandError(error, 'dev print-home');
79
+ process.exit(1);
80
+ }
81
+ });
82
+
83
+ dev
84
+ .command('print-work')
85
+ .description('Print resolved workspace path or empty line (stdout only; for scripts)')
86
+ .action(() => {
87
+ try {
88
+ const w = paths.getAifabrixWork();
89
+ process.stdout.write(w ? `${w}\n` : '\n');
90
+ } catch (error) {
91
+ handleCommandError(error, 'dev print-work');
92
+ process.exit(1);
93
+ }
94
+ });
95
+ }
96
+
97
+ function addSetFormatCommand(dev, handleSetFormat) {
98
+ dev
99
+ .command('set-format <format>')
100
+ .description('Default json|yaml when --format is omitted (download/convert)')
101
+ .action(async(format) => {
102
+ try {
103
+ await handleSetFormat(format);
104
+ } catch (error) {
105
+ handleCommandError(error, 'dev set-format');
106
+ process.exit(1);
107
+ }
108
+ });
109
+ }
110
+
111
+ /**
112
+ * Register dev set-home, set-work, print-*, set-format.
113
+ * @param {import('commander').Command} dev - dev subcommand group
114
+ * @param {function(string): Promise<void>} handleSetFormat - handler that updates format and refreshes display
115
+ * @returns {void}
116
+ */
117
+ function setupDevPathAndFormatCommands(dev, handleSetFormat) {
118
+ addSetHomeCommand(dev);
119
+ addSetWorkCommand(dev);
120
+ addPrintHomeWorkCommands(dev);
121
+ addSetFormatCommand(dev, handleSetFormat);
122
+ }
123
+
124
+ module.exports = { setupDevPathAndFormatCommands };