@aifabrix/builder 2.42.1 → 2.44.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.
- package/.cursor/rules/anchor-docs.mdc +15 -0
- package/README.md +2 -2
- package/anchor-docs/README.md +10 -0
- package/anchor-docs/_TEMPLATE +24 -0
- package/bin/aifabrix.js +13 -4
- package/integration/hubspot-test/README.md +157 -0
- package/integration/{hubspot → hubspot-test}/application.json +6 -6
- package/integration/{hubspot → hubspot-test}/create-hubspot.js +10 -10
- package/integration/hubspot-test/env.template +4 -0
- package/integration/hubspot-test/hubspot-test-datasource-company.json +138 -0
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +146 -0
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +146 -0
- package/integration/hubspot-test/hubspot-test-datasource-users.json +76 -0
- package/integration/{hubspot/hubspot-deploy.json → hubspot-test/hubspot-test-deploy.json} +201 -24
- package/integration/{hubspot/hubspot-system.json → hubspot-test/hubspot-test-system.json} +8 -7
- package/integration/hubspot-test/rbac.json +166 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-credential-real.yaml +3 -3
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-env-vars.yaml +2 -2
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-add-datasource.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-create.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-select.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-known-platform.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +2 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-mode.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-file.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-url.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-source.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-array-test.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +5 -0
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +5 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-dataplane-down-tests.js +1 -7
- package/integration/{hubspot → hubspot-test}/test-dataplane-down.js +3 -3
- package/integration/{hubspot → hubspot-test}/test.js +137 -102
- package/integration/{hubspot → hubspot-test}/wizard-hubspot-e2e.yaml +2 -2
- package/integration/{hubspot → hubspot-test}/wizard-hubspot-platform.yaml +1 -1
- package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
- package/integration/roundtrip-test-local/README.md +144 -0
- package/integration/roundtrip-test-local/application.yaml +13 -0
- package/integration/roundtrip-test-local/env.template +15 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
- package/integration/roundtrip-test-local2/README.md +144 -0
- package/integration/roundtrip-test-local2/application.yaml +13 -0
- package/integration/roundtrip-test-local2/env.template +15 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
- package/integration/test/wizard.yaml +8 -0
- package/jest.config.default.js +10 -0
- package/jest.config.integration.fixtures.js +22 -0
- package/jest.config.integration.js +21 -18
- package/jest.config.isolated.js +10 -0
- package/jest.projects.js +288 -0
- package/lib/api/datasources-core.api.js +3 -3
- package/lib/api/dev-mtls-request.js +110 -0
- package/lib/api/dev-server-https.js +145 -0
- package/lib/api/dev.api.js +133 -144
- package/lib/api/index.js +0 -1
- package/lib/api/pipeline.api.js +67 -20
- package/lib/api/service-users.api.js +111 -2
- package/lib/api/types/dev.types.js +4 -3
- package/lib/api/types/pipeline.types.js +8 -5
- package/lib/api/types/service-users.types.js +41 -0
- package/lib/api/types/validation-run.types.js +56 -0
- package/lib/api/validation-run.api.js +99 -0
- package/lib/api/validation-runner.js +99 -0
- package/lib/app/config.js +1 -1
- package/lib/app/deploy-status-display.js +2 -2
- package/lib/app/deploy.js +7 -6
- package/lib/app/display.js +2 -1
- package/lib/app/dockerfile.js +3 -2
- package/lib/app/down.js +2 -1
- package/lib/app/helpers.js +6 -5
- package/lib/app/index.js +27 -8
- package/lib/app/list.js +7 -6
- package/lib/app/push.js +4 -3
- package/lib/app/register.js +19 -8
- package/lib/app/rotate-secret.js +17 -13
- package/lib/app/run-container-start.js +184 -0
- package/lib/app/run-docker-fallback.js +108 -0
- package/lib/app/run-env-compose.js +30 -42
- package/lib/app/run-helpers.js +49 -126
- package/lib/app/run-infra-requirements.js +30 -0
- package/lib/app/run-resolve-image.js +21 -0
- package/lib/app/run.js +74 -21
- package/lib/app/show-display.js +1 -1
- package/lib/app/show.js +1 -1
- package/lib/build/index.js +13 -10
- package/lib/cli/index.js +2 -0
- package/lib/cli/setup-app.help.js +67 -0
- package/lib/cli/setup-app.js +59 -123
- package/lib/cli/setup-app.test-commands.js +179 -0
- package/lib/cli/setup-auth.js +36 -14
- package/lib/cli/setup-credential-deployment.js +22 -8
- package/lib/cli/setup-dev-path-commands.js +124 -0
- package/lib/cli/setup-dev.js +190 -103
- package/lib/cli/setup-environment.js +11 -20
- package/lib/cli/setup-external-system.js +62 -22
- package/lib/cli/setup-infra.js +139 -47
- package/lib/cli/setup-parameters.js +32 -0
- package/lib/cli/setup-secrets.js +147 -10
- package/lib/cli/setup-service-user.js +146 -20
- package/lib/cli/setup-utility.js +47 -19
- package/lib/commands/app-down.js +5 -7
- package/lib/commands/app-install.js +14 -7
- package/lib/commands/app-logs.js +13 -10
- package/lib/commands/app-shell.js +4 -1
- package/lib/commands/app-test.js +25 -19
- package/lib/commands/app.js +22 -10
- package/lib/commands/auth-config.js +10 -14
- package/lib/commands/auth-status.js +4 -3
- package/lib/commands/credential-env.js +4 -3
- package/lib/commands/credential-list.js +5 -4
- package/lib/commands/credential-push.js +4 -3
- package/lib/commands/datasource-unified-test-cli.js +495 -0
- package/lib/commands/datasource-unified-test-cli.options.js +149 -0
- package/lib/commands/datasource-validation-cli.js +129 -0
- package/lib/commands/datasource.js +123 -71
- package/lib/commands/deployment-list.js +6 -5
- package/lib/commands/dev-cli-handlers.js +122 -18
- package/lib/commands/dev-down.js +4 -3
- package/lib/commands/dev-init.js +231 -116
- package/lib/commands/dev-show-display.js +473 -0
- package/lib/commands/login-credentials.js +3 -2
- package/lib/commands/login-device.js +4 -3
- package/lib/commands/login.js +5 -4
- package/lib/commands/logout.js +8 -7
- package/lib/commands/parameters-validate.js +54 -0
- package/lib/commands/repair-datasource.js +314 -68
- package/lib/commands/repair-env-template.js +16 -10
- package/lib/commands/repair-rbac.js +25 -19
- package/lib/commands/repair.js +116 -32
- package/lib/commands/secrets-list.js +23 -12
- package/lib/commands/secrets-remove-all.js +220 -0
- package/lib/commands/secrets-remove.js +22 -13
- package/lib/commands/secrets-set.js +21 -12
- package/lib/commands/secrets-validate.js +20 -7
- package/lib/commands/secure.js +10 -9
- package/lib/commands/service-user.js +243 -13
- package/lib/commands/test-e2e-external.js +27 -1
- package/lib/commands/up-common.js +28 -2
- package/lib/commands/up-dataplane.js +31 -18
- package/lib/commands/up-miso.js +19 -29
- package/lib/commands/upload.js +138 -39
- package/lib/commands/wizard-core-helpers.js +1 -1
- package/lib/commands/wizard-dataplane.js +4 -3
- package/lib/commands/wizard-helpers.js +3 -3
- package/lib/commands/wizard.js +2 -2
- package/lib/core/admin-secrets.js +16 -5
- package/lib/core/audit-logger.js +12 -4
- package/lib/core/config-attach-extensions.js +46 -0
- package/lib/core/config-runtime-paths.js +29 -0
- package/lib/core/config.js +59 -58
- package/lib/core/diff.js +3 -2
- package/lib/core/ensure-encryption-key.js +2 -4
- package/lib/core/secrets-ensure-infra.js +77 -0
- package/lib/core/secrets-ensure.js +120 -64
- package/lib/core/secrets-env-write.js +35 -7
- package/lib/core/secrets-infra-placeholder-sync.js +61 -0
- package/lib/core/secrets.js +228 -42
- package/lib/core/templates-env.js +4 -3
- package/lib/core/templates.js +1 -1
- package/lib/datasource/abac-validator.js +148 -0
- package/lib/datasource/deploy.js +75 -53
- package/lib/datasource/field-reference-validator.js +77 -36
- package/lib/datasource/integration-context.js +63 -0
- package/lib/datasource/list.js +8 -7
- package/lib/datasource/log-viewer.js +252 -0
- package/lib/datasource/resolve-app.js +109 -0
- package/lib/datasource/test-e2e.js +95 -155
- package/lib/datasource/test-integration.js +121 -109
- package/lib/datasource/unified-validation-run-body.js +65 -0
- package/lib/datasource/unified-validation-run-post.js +23 -0
- package/lib/datasource/unified-validation-run-resolve.js +43 -0
- package/lib/datasource/unified-validation-run.js +92 -0
- package/lib/datasource/validate.js +162 -15
- package/lib/deployment/deployer.js +4 -3
- package/lib/deployment/environment.js +7 -6
- package/lib/deployment/push.js +17 -8
- package/lib/external-system/delete.js +4 -3
- package/lib/external-system/deploy.js +131 -53
- package/lib/external-system/download-helpers.js +1 -1
- package/lib/external-system/download.js +7 -6
- package/lib/external-system/generator.js +104 -14
- package/lib/external-system/integration-test-dispatch.js +26 -0
- package/lib/external-system/test-execution.js +5 -1
- package/lib/external-system/test-helpers.js +0 -4
- package/lib/external-system/test-system-level-helpers.js +110 -0
- package/lib/external-system/test-system-level.js +83 -44
- package/lib/external-system/test.js +59 -8
- package/lib/generator/builders.js +23 -11
- package/lib/generator/deploy-manifest-azure-kv.js +81 -0
- package/lib/generator/external-controller-manifest.js +3 -3
- package/lib/generator/external.js +23 -11
- package/lib/generator/helpers.js +71 -12
- package/lib/generator/index.js +8 -4
- package/lib/generator/split-readme.js +12 -7
- package/lib/generator/split-variables.js +2 -1
- package/lib/generator/split.js +46 -11
- package/lib/generator/wizard-readme.js +3 -3
- package/lib/generator/wizard.js +16 -13
- package/lib/infrastructure/compose.js +60 -6
- package/lib/infrastructure/helpers.js +238 -51
- package/lib/infrastructure/index.js +64 -37
- package/lib/infrastructure/services.js +21 -15
- package/lib/internal/fs-real-sync.js +104 -0
- package/lib/internal/node-fs.js +98 -0
- package/lib/parameters/database-secret-values.js +173 -0
- package/lib/parameters/infra-kv-discovery.js +121 -0
- package/lib/parameters/infra-parameter-catalog.js +458 -0
- package/lib/parameters/infra-parameter-validate.js +64 -0
- package/lib/schema/application-schema.json +37 -17
- package/lib/schema/datasource-test-run.schema.json +493 -0
- package/lib/schema/deployment-rules.yaml +102 -63
- package/lib/schema/external-datasource.schema.json +1201 -433
- package/lib/schema/external-system.schema.json +181 -5
- package/lib/schema/flag-map-validation-run.json +31 -0
- package/lib/schema/infra-parameter.schema.json +106 -0
- package/lib/schema/infra.parameter.yaml +421 -0
- package/lib/schema/type/credential-auth-templates.json +40 -0
- package/lib/schema/type/document-storage.json +213 -0
- package/lib/schema/type/message-service.json +123 -0
- package/lib/schema/type/vector-store.json +88 -0
- package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
- package/lib/utils/api-error-handler.js +2 -2
- package/lib/utils/api.js +49 -14
- package/lib/utils/app-config-resolver.js +23 -1
- package/lib/utils/app-register-api.js +3 -2
- package/lib/utils/app-register-auth.js +1 -1
- package/lib/utils/app-register-config.js +4 -4
- package/lib/utils/app-register-display.js +3 -2
- package/lib/utils/app-register-validator.js +3 -2
- package/lib/utils/app-run-containers.js +26 -22
- package/lib/utils/app-scoped-config.js +31 -0
- package/lib/utils/app-service-env-from-builder.js +164 -0
- package/lib/utils/build-copy.js +1 -1
- package/lib/utils/build-helpers.js +20 -20
- package/lib/utils/build-resolve-image.js +165 -0
- package/lib/utils/cli-layout-chalk.js +8 -0
- package/lib/utils/cli-test-layout-chalk.js +267 -0
- package/lib/utils/cli-utils.js +88 -11
- package/lib/utils/compose-db-passwords.js +138 -0
- package/lib/utils/compose-generate-docker-compose.js +216 -0
- package/lib/utils/compose-generator.js +197 -291
- package/lib/utils/compose-miso-env.js +18 -0
- package/lib/utils/compose-traefik-ingress-base.js +158 -0
- package/lib/utils/config-paths.js +209 -6
- package/lib/utils/config-scoped-resources-preference.js +41 -0
- package/lib/utils/controller-deployment-outcome.js +68 -0
- package/lib/utils/credential-display.js +2 -2
- package/lib/utils/credential-secrets-env.js +16 -1
- package/lib/utils/dataplane-pipeline-warning.js +4 -3
- package/lib/utils/datasource-test-run-capability-scope.js +43 -0
- package/lib/utils/datasource-test-run-debug-display.js +137 -0
- package/lib/utils/datasource-test-run-debug-slice.js +93 -0
- package/lib/utils/datasource-test-run-display.js +442 -0
- package/lib/utils/datasource-test-run-exit.js +58 -0
- package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
- package/lib/utils/datasource-test-run-report-version.js +51 -0
- package/lib/utils/datasource-test-run-schema-sync.js +59 -0
- package/lib/utils/datasource-test-run-tty-log.js +81 -0
- package/lib/utils/datasource-validation-watch.js +266 -0
- package/lib/utils/declarative-url-ports.js +47 -0
- package/lib/utils/derive-env-key-from-client-id.js +41 -0
- package/lib/utils/dev-ca-install.js +185 -23
- package/lib/utils/dev-cert-helper.js +266 -17
- package/lib/utils/dev-hosts-helper.js +307 -0
- package/lib/utils/dev-init-cert-hints.js +37 -0
- package/lib/utils/dev-init-health-messages.js +52 -0
- package/lib/utils/dev-init-resolve.js +86 -0
- package/lib/utils/dev-init-ssh-merge.js +65 -0
- package/lib/utils/dev-ssh-config-helper.js +196 -0
- package/lib/utils/dev-user-groups.js +93 -0
- package/lib/utils/docker-build.js +42 -17
- package/lib/utils/docker-exec.js +28 -0
- package/lib/utils/docker-manifest-public-port.js +116 -0
- package/lib/utils/docker-not-running-hint.js +52 -0
- package/lib/utils/docker.js +98 -11
- package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
- package/lib/utils/env-config-loader.js +10 -91
- package/lib/utils/env-copy.js +19 -10
- package/lib/utils/env-map.js +42 -11
- package/lib/utils/env-template.js +2 -2
- package/lib/utils/environment-scoped-resources.js +144 -0
- package/lib/utils/error-formatter.js +125 -9
- package/lib/utils/error-formatters/http-status-errors.js +6 -5
- package/lib/utils/error-formatters/network-errors.js +2 -1
- package/lib/utils/error-formatters/permission-errors.js +2 -1
- package/lib/utils/error-formatters/validation-errors.js +2 -1
- package/lib/utils/external-env-template.js +180 -0
- package/lib/utils/external-readme.js +8 -1
- package/lib/utils/external-system-display.js +277 -136
- package/lib/utils/external-system-local-test-tty.js +389 -0
- package/lib/utils/external-system-readiness-core.js +377 -0
- package/lib/utils/external-system-readiness-deploy-display.js +270 -0
- package/lib/utils/external-system-readiness-display-internals.js +150 -0
- package/lib/utils/external-system-readiness-display.js +186 -0
- package/lib/utils/external-system-test-helpers.js +24 -6
- package/lib/utils/external-system-validators.js +32 -14
- package/lib/utils/health-check-url.js +119 -0
- package/lib/utils/health-check.js +59 -25
- package/lib/utils/help-builder.js +14 -13
- package/lib/utils/image-version.js +4 -8
- package/lib/utils/infra-containers.js +4 -7
- package/lib/utils/infra-env-defaults.js +162 -0
- package/lib/utils/infra-status-display.js +167 -0
- package/lib/utils/infra-status.js +16 -8
- package/lib/utils/local-secrets.js +29 -7
- package/lib/utils/paths.js +136 -48
- package/lib/utils/port-resolver.js +10 -23
- package/lib/utils/redis-env-scope.js +62 -0
- package/lib/utils/register-aifabrix-shell-env.js +204 -0
- package/lib/utils/remote-builder-validation.js +99 -0
- package/lib/utils/remote-dev-auth.js +117 -21
- package/lib/utils/remote-docker-env.js +67 -15
- package/lib/utils/remote-secrets-loader.js +13 -4
- package/lib/utils/resolve-docker-image-ref.js +124 -0
- package/lib/utils/schema-loader.js +22 -9
- package/lib/utils/secrets-bash-kv.js +25 -0
- package/lib/utils/secrets-generator.js +171 -51
- package/lib/utils/secrets-helpers.js +70 -59
- package/lib/utils/secrets-kv-scope.js +60 -0
- package/lib/utils/secrets-utils.js +35 -37
- package/lib/utils/secrets-validation.js +3 -1
- package/lib/utils/secrets-yaml-preserve.js +109 -0
- package/lib/utils/secure-file-permissions.js +91 -0
- package/lib/utils/ssh-key-helper.js +4 -2
- package/lib/utils/template-helpers.js +2 -2
- package/lib/utils/test-log-writer.js +3 -3
- package/lib/utils/token-manager.js +37 -5
- package/lib/utils/url-declarative-public-base.js +188 -0
- package/lib/utils/url-declarative-resolve-build.js +493 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
- package/lib/utils/url-declarative-resolve.js +220 -0
- package/lib/utils/url-declarative-token-parse.js +74 -0
- package/lib/utils/url-declarative-url-flags.js +50 -0
- package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
- package/lib/utils/url-public-path-prefix.js +34 -0
- package/lib/utils/urls-local-registry.js +220 -0
- package/lib/utils/validation-report-tty-kit.js +77 -0
- package/lib/utils/validation-run-poll.js +89 -0
- package/lib/utils/validation-run-post-retry.js +73 -0
- package/lib/utils/validation-run-request.js +98 -0
- package/lib/utils/variable-transformer.js +21 -4
- package/lib/utils/yaml-preserve.js +78 -1
- package/lib/validation/datasource-warnings.js +56 -0
- package/lib/validation/env-template-auth.js +50 -2
- package/lib/validation/external-manifest-validator.js +35 -7
- package/lib/validation/validate-display.js +37 -31
- package/lib/validation/validate.js +9 -10
- package/lib/validation/validator-unresolved-placeholders.js +98 -0
- package/lib/validation/validator.js +32 -78
- package/lib/validation/wizard-config-validator.js +2 -1
- package/package.json +11 -3
- package/scripts/check-datasource-test-run-schema-sync.js +34 -0
- package/scripts/diagnose-cli.js +150 -0
- package/scripts/install-local.js +304 -55
- package/templates/README.md +15 -2
- package/templates/applications/dataplane/application.yaml +52 -2
- package/templates/applications/dataplane/env.template +80 -18
- package/templates/applications/dataplane/rbac.yaml +8 -0
- package/templates/applications/keycloak/application.yaml +9 -1
- package/templates/applications/keycloak/env.template +15 -6
- package/templates/applications/miso-controller/application.yaml +10 -2
- package/templates/applications/miso-controller/env.template +55 -14
- package/templates/applications/miso-controller/rbac.yaml +5 -0
- package/templates/external-system/README.md.hbs +20 -7
- package/templates/external-system/deploy.js.hbs +5 -5
- package/templates/external-system/env.template.hbs +22 -0
- package/templates/external-system/external-datasource.yaml.hbs +197 -118
- package/templates/infra/compose.yaml.hbs +20 -4
- package/templates/python/docker-compose.hbs +16 -0
- package/templates/typescript/docker-compose.hbs +16 -0
- package/integration/hubspot/README.md +0 -102
- package/integration/hubspot/env.template +0 -4
- package/integration/hubspot/hubspot-datasource-company.json +0 -541
- package/integration/hubspot/hubspot-datasource-contact.json +0 -639
- package/integration/hubspot/hubspot-datasource-deal.json +0 -588
- package/integration/hubspot/hubspot-datasource-users.json +0 -116
- package/integration/hubspot/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
- package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
- package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
- package/lib/api/external-test.api.js +0 -111
- package/lib/schema/env-config.yaml +0 -43
- /package/integration/{hubspot → hubspot-test}/companies.json +0 -0
- /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-app-name.yaml +0 -0
- /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-missing-app.yaml +0 -0
- /package/integration/{hubspot → hubspot-test}/test-dataplane-down-helpers.js +0 -0
package/lib/cli/setup-dev.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
1
2
|
/**
|
|
2
3
|
* CLI developer configuration command setup (dev config, dev set-id, dev init, dev add/update/pin/delete/list).
|
|
3
4
|
*
|
|
@@ -8,10 +9,11 @@
|
|
|
8
9
|
|
|
9
10
|
const chalk = require('chalk');
|
|
10
11
|
const config = require('../core/config');
|
|
11
|
-
const devConfig = require('../utils/dev-config');
|
|
12
12
|
const logger = require('../utils/logger');
|
|
13
13
|
const { handleCommandError } = require('../utils/cli-utils');
|
|
14
|
+
const { setupDevPathAndFormatCommands } = require('./setup-dev-path-commands');
|
|
14
15
|
const { runDevInit, runDevRefresh } = require('../commands/dev-init');
|
|
16
|
+
const { displayDevConfig } = require('../commands/dev-show-display');
|
|
15
17
|
const {
|
|
16
18
|
handleDevList,
|
|
17
19
|
handleDevAdd,
|
|
@@ -20,45 +22,78 @@ const {
|
|
|
20
22
|
handleDevDelete
|
|
21
23
|
} = require('../commands/dev-cli-handlers');
|
|
22
24
|
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
25
|
+
/** Appended to `dev update --help` (examples + partial-update behaviour). */
|
|
26
|
+
const DEV_UPDATE_HELP_AFTER = `
|
|
27
|
+
Examples:
|
|
28
|
+
$ aifabrix dev update 02 --name "Jane Doe"
|
|
29
|
+
$ aifabrix dev update --developer-id 02 --email jane@example.com
|
|
30
|
+
$ aifabrix dev update 01 --name "Admin" --groups admin,developer
|
|
31
|
+
$ aifabrix dev update 02 --groups admin,developer,docker
|
|
32
|
+
|
|
33
|
+
Partial update: only flags you pass are sent to the server. Omitted name, email, and groups are left unchanged.
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
/** Appended to `dev add --help` (examples + workflow). */
|
|
37
|
+
const DEV_ADD_HELP_AFTER = `
|
|
38
|
+
Examples:
|
|
39
|
+
$ aifabrix dev add --developer-id 02 --name "Jane Doe" --email jane@example.com
|
|
40
|
+
$ aifabrix dev add --developer-id 03 --name "Build admin" --email admin@example.com --groups admin,developer
|
|
41
|
+
$ aifabrix dev add --developer-id 04 --name "CI user" --email ci@example.com --groups secret-manager,developer
|
|
42
|
+
|
|
43
|
+
Requires a configured remote Builder Server and an admin client certificate (same machine setup as dev list / dev pin). After add, run dev pin <id> once to create a PIN for aifabrix dev init.
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
/** Appended to `aifabrix dev --help` (overview; keep subcommand .description lines short). */
|
|
47
|
+
const DEV_GROUP_HELP_AFTER = `
|
|
48
|
+
Categories:
|
|
49
|
+
Local config show, set-id, set-scoped-resources, set-env-config, set-home, set-work, set-format, print-home, print-work
|
|
50
|
+
Onboarding init (PIN onboarding), refresh (sync settings / renew cert)
|
|
51
|
+
Remote admin list, add, update, pin, delete (need remote-server + client cert in ~/.aifabrix)
|
|
52
|
+
Sync / stop down (Mutagen; optional --apps for containers)
|
|
53
|
+
|
|
54
|
+
Use: aifabrix dev <command> --help
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
/** Appended to `dev init --help`. */
|
|
58
|
+
const DEV_INIT_HELP_AFTER = `
|
|
59
|
+
Examples:
|
|
60
|
+
Full (first machine or no config yet):
|
|
61
|
+
$ aifabrix dev init --developer-id 01 --server https://builder01.local --pin <one-time-pin>
|
|
62
|
+
|
|
63
|
+
When remote-server and developer-id are already in ~/.aifabrix/config.yaml (from settings or dev show):
|
|
64
|
+
$ aifabrix dev init --pin <one-time-pin>
|
|
65
|
+
|
|
66
|
+
Admin issues the PIN with: aifabrix dev pin <developer-id>
|
|
67
|
+
`;
|
|
68
|
+
|
|
69
|
+
/** Appended to `dev refresh --help`. */
|
|
70
|
+
const DEV_REFRESH_HELP_AFTER = `
|
|
71
|
+
Requires remote-server and saved client certificate (after dev init). Use --cert to force a new cert before expiry.
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
/** Appended to `dev pin --help`. */
|
|
75
|
+
const DEV_PIN_HELP_AFTER = `
|
|
76
|
+
Examples:
|
|
77
|
+
$ aifabrix dev pin 02
|
|
78
|
+
$ aifabrix dev pin 02 --hosts-ip 192.168.1.25
|
|
79
|
+
$ aifabrix dev pin (uses developer-id from config)
|
|
80
|
+
|
|
81
|
+
Prints copy-paste commands for the developer: full dev init, hosts-file variant, and dev init --pin
|
|
82
|
+
when their config already has remote-server + developer-id.
|
|
83
|
+
`;
|
|
84
|
+
|
|
85
|
+
/** Appended to `dev delete --help`. */
|
|
86
|
+
const DEV_DELETE_HELP_AFTER = `
|
|
87
|
+
Example:
|
|
88
|
+
$ aifabrix dev delete 02
|
|
89
|
+
`;
|
|
90
|
+
|
|
91
|
+
/** Appended to `dev down --help`. */
|
|
92
|
+
const DEV_DOWN_HELP_AFTER = `
|
|
93
|
+
Examples:
|
|
94
|
+
$ aifabrix dev down
|
|
95
|
+
$ aifabrix dev down --apps
|
|
96
|
+
`;
|
|
62
97
|
|
|
63
98
|
/**
|
|
64
99
|
* Handle dev set-format command
|
|
@@ -67,57 +102,59 @@ async function displayDevConfig(devId) {
|
|
|
67
102
|
*/
|
|
68
103
|
async function handleSetFormat(format) {
|
|
69
104
|
await config.setFormat(format);
|
|
70
|
-
logger.log(
|
|
105
|
+
logger.log(formatSuccessLine(`Format set to ${format.toLowerCase()}`));
|
|
106
|
+
const devId = await config.getDeveloperId();
|
|
107
|
+
await displayDevConfig(devId);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Set useEnvironmentScopedResources in ~/.aifabrix/config.yaml
|
|
112
|
+
* @param {string} value - "true" or "false"
|
|
113
|
+
* @returns {Promise<void>}
|
|
114
|
+
*/
|
|
115
|
+
async function handleSetScopedResources(value) {
|
|
116
|
+
const b = String(value || '').trim().toLowerCase();
|
|
117
|
+
if (b !== 'true' && b !== 'false') {
|
|
118
|
+
throw new Error('Value must be true or false (example: aifabrix dev set-scoped-resources true)');
|
|
119
|
+
}
|
|
120
|
+
await config.setUseEnvironmentScopedResources(b === 'true');
|
|
121
|
+
if (b === 'true') {
|
|
122
|
+
logger.log(
|
|
123
|
+
formatSuccessLine('Environment-scoped resources activated in ~/.aifabrix/config.yaml')
|
|
124
|
+
);
|
|
125
|
+
} else {
|
|
126
|
+
logger.log(formatSuccessLine('Environment-scoped resources passivated (default local naming)'));
|
|
127
|
+
}
|
|
128
|
+
logger.log(
|
|
129
|
+
chalk.gray(
|
|
130
|
+
' Apps still need environmentScopedResources: true in application.yaml for prefixing when you run with --env dev or tst.'
|
|
131
|
+
)
|
|
132
|
+
);
|
|
71
133
|
const devId = await config.getDeveloperId();
|
|
72
134
|
await displayDevConfig(devId);
|
|
73
135
|
}
|
|
74
136
|
|
|
75
137
|
/**
|
|
76
|
-
* Register dev
|
|
138
|
+
* Register dev show and set-id commands.
|
|
77
139
|
* @param {Command} dev - dev subcommand group
|
|
78
140
|
*/
|
|
79
|
-
function
|
|
141
|
+
function setupDevShowAndSetId(dev) {
|
|
80
142
|
dev
|
|
81
|
-
.command('
|
|
82
|
-
.description('Show
|
|
83
|
-
.
|
|
84
|
-
.action(async(options) => {
|
|
143
|
+
.command('show')
|
|
144
|
+
.description('Show dev ports and ~/.aifabrix config')
|
|
145
|
+
.action(async() => {
|
|
85
146
|
try {
|
|
86
|
-
const setIdValue = options.setId || options['set-id'];
|
|
87
|
-
if (setIdValue) {
|
|
88
|
-
const digitsOnly = /^[0-9]+$/.test(setIdValue);
|
|
89
|
-
if (!digitsOnly) {
|
|
90
|
-
throw new Error('Developer ID must be a non-negative digit string (0 = default infra, > 0 = developer-specific)');
|
|
91
|
-
}
|
|
92
|
-
await config.setDeveloperId(setIdValue);
|
|
93
|
-
process.env.AIFABRIX_DEVELOPERID = setIdValue;
|
|
94
|
-
logger.log(chalk.green(`✓ Developer ID set to ${setIdValue}`));
|
|
95
|
-
await displayDevConfig(setIdValue);
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
147
|
const devId = await config.getDeveloperId();
|
|
99
148
|
await displayDevConfig(devId);
|
|
100
149
|
} catch (error) {
|
|
101
|
-
handleCommandError(error, 'dev
|
|
102
|
-
process.exit(1);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
dev
|
|
107
|
-
.command('set-format <format>')
|
|
108
|
-
.description('Set default output format for download/convert (json | yaml); used when --format not passed')
|
|
109
|
-
.action(async(format) => {
|
|
110
|
-
try {
|
|
111
|
-
await handleSetFormat(format);
|
|
112
|
-
} catch (error) {
|
|
113
|
-
handleCommandError(error, 'dev set-format');
|
|
150
|
+
handleCommandError(error, 'dev show');
|
|
114
151
|
process.exit(1);
|
|
115
152
|
}
|
|
116
153
|
});
|
|
117
154
|
|
|
118
155
|
dev
|
|
119
156
|
.command('set-id <id>')
|
|
120
|
-
.description('Set developer ID (
|
|
157
|
+
.description('Set developer ID (0 = default infra, >0 = dev-specific ports)')
|
|
121
158
|
.action(async(id) => {
|
|
122
159
|
try {
|
|
123
160
|
const digitsOnly = /^[0-9]+$/.test(id);
|
|
@@ -126,40 +163,83 @@ function setupDevConfigCommands(dev) {
|
|
|
126
163
|
}
|
|
127
164
|
await config.setDeveloperId(id);
|
|
128
165
|
process.env.AIFABRIX_DEVELOPERID = id;
|
|
129
|
-
logger.log(
|
|
166
|
+
logger.log(formatSuccessLine(`Developer ID set to ${id}`));
|
|
130
167
|
await displayDevConfig(id);
|
|
131
168
|
} catch (error) {
|
|
132
169
|
handleCommandError(error, 'dev set-id');
|
|
133
170
|
process.exit(1);
|
|
134
171
|
}
|
|
135
172
|
});
|
|
136
|
-
}
|
|
137
173
|
|
|
138
|
-
/**
|
|
139
|
-
* Register dev init and refresh commands.
|
|
140
|
-
* @param {Command} dev - dev subcommand group
|
|
141
|
-
*/
|
|
142
|
-
function setupDevInitCommand(dev) {
|
|
143
174
|
dev
|
|
144
|
-
.command('
|
|
145
|
-
.description('
|
|
146
|
-
.
|
|
147
|
-
.requiredOption('--server <url>', 'Builder Server base URL (e.g. https://dev.aifabrix.dev)')
|
|
148
|
-
.requiredOption('--pin <pin>', 'One-time PIN from your admin')
|
|
149
|
-
.option('-y, --yes', 'Auto-install development CA without prompt when certificate is untrusted')
|
|
150
|
-
.option('--no-install-ca', 'Do not offer CA install; fail with manual instructions on untrusted certificate')
|
|
151
|
-
.action(async(options) => {
|
|
175
|
+
.command('set-scoped-resources <value>')
|
|
176
|
+
.description('Set useEnvironmentScopedResources to true|false in ~/.aifabrix/config.yaml')
|
|
177
|
+
.action(async(value) => {
|
|
152
178
|
try {
|
|
153
|
-
await
|
|
179
|
+
await handleSetScopedResources(value);
|
|
154
180
|
} catch (error) {
|
|
155
|
-
handleCommandError(error, 'dev
|
|
181
|
+
handleCommandError(error, 'dev set-scoped-resources');
|
|
156
182
|
process.exit(1);
|
|
157
183
|
}
|
|
158
184
|
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Register dev show, set-id, set-env-config, set-home and set-format commands.
|
|
189
|
+
* @param {Command} dev - dev subcommand group
|
|
190
|
+
*/
|
|
191
|
+
function setupDevConfigCommands(dev) {
|
|
192
|
+
setupDevShowAndSetId(dev);
|
|
193
|
+
setupDevPathAndFormatCommands(dev, handleSetFormat);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Shared Commander options for dev init (PIN onboarding).
|
|
198
|
+
* @param {object} cmd - Commander command to attach options to
|
|
199
|
+
* @returns {object} Same command for chaining
|
|
200
|
+
*/
|
|
201
|
+
function addDevOnboardingOptions(cmd) {
|
|
202
|
+
return cmd
|
|
203
|
+
.requiredOption('--pin <pin>', 'One-time PIN from your admin (see aifabrix dev pin)')
|
|
204
|
+
.option(
|
|
205
|
+
'--developer-id <id>',
|
|
206
|
+
'Developer ID (optional if set in ~/.aifabrix/config.yaml and not 0; e.g. 01)'
|
|
207
|
+
)
|
|
208
|
+
.option('--server <url>', 'Builder Server base URL (optional if remote-server is in config)')
|
|
209
|
+
.option('-y, --yes', 'Auto-install development CA without prompt when certificate is untrusted; with --add-hosts, skip hosts-file confirmation')
|
|
210
|
+
.option('--no-install-ca', 'Do not offer CA install; fail with manual instructions on untrusted certificate')
|
|
211
|
+
.option(
|
|
212
|
+
'--add-hosts',
|
|
213
|
+
'Offer to add the server hostname to this machine\'s hosts file (wildcard DNS must be configured separately; may require admin)'
|
|
214
|
+
)
|
|
215
|
+
.option('--hosts-ip <ip>', 'IPv4 for the hosts entry when using --add-hosts (skips lookup / IP prompt)');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Register dev init and refresh commands.
|
|
220
|
+
* @param {Command} dev - dev subcommand group
|
|
221
|
+
*/
|
|
222
|
+
function setupDevInitCommand(dev) {
|
|
223
|
+
const runOnboarding = async(options, label) => {
|
|
224
|
+
try {
|
|
225
|
+
await runDevInit(options);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
handleCommandError(error, label);
|
|
228
|
+
process.exit(1);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
addDevOnboardingOptions(
|
|
233
|
+
dev
|
|
234
|
+
.command('init')
|
|
235
|
+
.description('Onboard with Builder Server (cert, settings, SSH for Mutagen)')
|
|
236
|
+
.addHelpText('after', DEV_INIT_HELP_AFTER)
|
|
237
|
+
).action(async(options) => runOnboarding(options, 'dev init'));
|
|
159
238
|
|
|
160
239
|
dev
|
|
161
240
|
.command('refresh')
|
|
162
|
-
.description('
|
|
241
|
+
.description('Pull server settings into config; renew cert if due or --cert')
|
|
242
|
+
.addHelpText('after', DEV_REFRESH_HELP_AFTER)
|
|
163
243
|
.option('--cert', 'Force certificate refresh (create PIN + issue-cert) even when cert is still valid')
|
|
164
244
|
.action(async(options) => {
|
|
165
245
|
try {
|
|
@@ -178,7 +258,7 @@ function setupDevInitCommand(dev) {
|
|
|
178
258
|
function setupDevListAddCommands(dev) {
|
|
179
259
|
dev
|
|
180
260
|
.command('list')
|
|
181
|
-
.description('List
|
|
261
|
+
.description('List developers (remote Builder Server)')
|
|
182
262
|
.action(async() => {
|
|
183
263
|
try {
|
|
184
264
|
await handleDevList();
|
|
@@ -190,11 +270,12 @@ function setupDevListAddCommands(dev) {
|
|
|
190
270
|
|
|
191
271
|
dev
|
|
192
272
|
.command('add')
|
|
193
|
-
.description('
|
|
194
|
-
.requiredOption('--developer-id <id>', '
|
|
273
|
+
.description('Create developer on server (admin); then dev pin for onboarding')
|
|
274
|
+
.requiredOption('--developer-id <id>', 'Unique id, digits only (e.g. 02); used with dev init --developer-id')
|
|
195
275
|
.requiredOption('--name <name>', 'Display name')
|
|
196
276
|
.requiredOption('--email <email>', 'Email address')
|
|
197
|
-
.option('--groups <items>', 'Comma-separated
|
|
277
|
+
.option('--groups <items>', 'Comma-separated roles: admin, secret-manager, developer, docker', 'developer')
|
|
278
|
+
.addHelpText('after', DEV_ADD_HELP_AFTER)
|
|
198
279
|
.action(async(options) => {
|
|
199
280
|
try {
|
|
200
281
|
await handleDevAdd(options);
|
|
@@ -212,11 +293,12 @@ function setupDevListAddCommands(dev) {
|
|
|
212
293
|
function setupDevUpdatePinDeleteCommands(dev) {
|
|
213
294
|
dev
|
|
214
295
|
.command('update [developerId]')
|
|
215
|
-
.description('
|
|
296
|
+
.description('Patch name/email/groups (admin); only given flags change')
|
|
216
297
|
.option('--developer-id <id>', 'Developer ID (same as dev add)')
|
|
217
298
|
.option('--name <name>', 'Display name')
|
|
218
299
|
.option('--email <email>', 'Email address')
|
|
219
|
-
.option('--groups <items>', 'Comma-separated groups (admin, secret-manager, developer)')
|
|
300
|
+
.option('--groups <items>', 'Comma-separated groups (admin, secret-manager, developer, docker)')
|
|
301
|
+
.addHelpText('after', DEV_UPDATE_HELP_AFTER)
|
|
220
302
|
.action(async(developerId, options) => {
|
|
221
303
|
try {
|
|
222
304
|
await handleDevUpdate(developerId, options);
|
|
@@ -228,10 +310,12 @@ function setupDevUpdatePinDeleteCommands(dev) {
|
|
|
228
310
|
|
|
229
311
|
dev
|
|
230
312
|
.command('pin [developerId]')
|
|
231
|
-
.description('
|
|
232
|
-
.
|
|
313
|
+
.description('One-time onboarding PIN for dev init (admin)')
|
|
314
|
+
.option('--hosts-ip <ip>', 'Builder Server LAN IPv4 to embed in the hosts-file init command (optional)')
|
|
315
|
+
.addHelpText('after', DEV_PIN_HELP_AFTER)
|
|
316
|
+
.action(async(developerId, options) => {
|
|
233
317
|
try {
|
|
234
|
-
await handleDevPin(developerId);
|
|
318
|
+
await handleDevPin(developerId, options);
|
|
235
319
|
} catch (error) {
|
|
236
320
|
handleCommandError(error, 'dev pin');
|
|
237
321
|
process.exit(1);
|
|
@@ -240,7 +324,8 @@ function setupDevUpdatePinDeleteCommands(dev) {
|
|
|
240
324
|
|
|
241
325
|
dev
|
|
242
326
|
.command('delete <developerId>')
|
|
243
|
-
.description('Remove
|
|
327
|
+
.description('Remove developer from server (admin)')
|
|
328
|
+
.addHelpText('after', DEV_DELETE_HELP_AFTER)
|
|
244
329
|
.action(async(developerId) => {
|
|
245
330
|
try {
|
|
246
331
|
await handleDevDelete(developerId);
|
|
@@ -252,7 +337,8 @@ function setupDevUpdatePinDeleteCommands(dev) {
|
|
|
252
337
|
|
|
253
338
|
dev
|
|
254
339
|
.command('down')
|
|
255
|
-
.description('Stop Mutagen sync
|
|
340
|
+
.description('Stop Mutagen sync; --apps also stops app containers')
|
|
341
|
+
.addHelpText('after', DEV_DOWN_HELP_AFTER)
|
|
256
342
|
.option('--apps', 'Also stop running app containers for this developer')
|
|
257
343
|
.action(async(options) => {
|
|
258
344
|
try {
|
|
@@ -281,7 +367,8 @@ function setupDevUserCommands(dev) {
|
|
|
281
367
|
function setupDevCommands(program) {
|
|
282
368
|
const dev = program
|
|
283
369
|
.command('dev')
|
|
284
|
-
.description('
|
|
370
|
+
.description('Local dev config, Builder onboarding, remote admin, Mutagen/sync')
|
|
371
|
+
.addHelpText('after', DEV_GROUP_HELP_AFTER);
|
|
285
372
|
|
|
286
373
|
setupDevConfigCommands(dev);
|
|
287
374
|
setupDevInitCommand(dev);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI environment deployment command setup (
|
|
2
|
+
* CLI environment deployment command setup (env deploy).
|
|
3
3
|
*
|
|
4
4
|
* @fileoverview Environment command definitions for AI Fabrix Builder CLI
|
|
5
5
|
* @author AI Fabrix Team
|
|
@@ -18,35 +18,26 @@ function setupEnvironmentCommands(program) {
|
|
|
18
18
|
const environmentDeploy = require('../deployment/environment');
|
|
19
19
|
await environmentDeploy.deployEnvironment(envKey, options);
|
|
20
20
|
} catch (error) {
|
|
21
|
-
handleCommandError(error, '
|
|
21
|
+
handleCommandError(error, 'env deploy');
|
|
22
22
|
process.exit(1);
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
const environment = program
|
|
27
|
-
.command('environment')
|
|
28
|
-
.description('Deploy and manage Miso Controller environments (dev, tst, pro, miso)');
|
|
29
|
-
|
|
30
26
|
const deployExamples = `
|
|
31
27
|
Examples:
|
|
32
|
-
$ aifabrix
|
|
33
|
-
$ aifabrix
|
|
34
|
-
$ aifabrix
|
|
28
|
+
$ aifabrix env deploy dev
|
|
29
|
+
$ aifabrix env deploy tst --preset m
|
|
30
|
+
$ aifabrix env deploy dev --config ./env-config.json --no-poll`;
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
.option('--preset <size>', 'Environment size preset: s, m, l, xl (default: s)', 's')
|
|
41
|
-
.option('--skip-validation', 'Skip environment validation')
|
|
42
|
-
.option('--poll', 'Poll for deployment status', true)
|
|
43
|
-
.option('--no-poll', 'Do not poll for status')
|
|
44
|
-
.addHelpText('after', deployExamples)
|
|
45
|
-
.action(deployEnvHandler);
|
|
32
|
+
const ENV_GROUP_HELP_AFTER = `
|
|
33
|
+
Subcommands:
|
|
34
|
+
deploy <env> Provision/update environment in Miso Controller (see env deploy --help)
|
|
35
|
+
`;
|
|
46
36
|
|
|
47
37
|
const env = program
|
|
48
38
|
.command('env')
|
|
49
|
-
.description('
|
|
39
|
+
.description('Miso Controller environments (primary: env deploy <env>)')
|
|
40
|
+
.addHelpText('after', ENV_GROUP_HELP_AFTER);
|
|
50
41
|
|
|
51
42
|
env
|
|
52
43
|
.command('deploy <env>')
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* CLI external system command setup (download, upload, delete, test-integration).
|
|
3
3
|
*
|
|
4
4
|
* Registers these commands on the Commander program:
|
|
5
|
-
* - download <
|
|
6
|
-
* - upload <
|
|
7
|
-
* - delete <
|
|
5
|
+
* - download <systemKey> – Download external system from dataplane to integration/<systemKey>/
|
|
6
|
+
* - upload <systemKey> – Upload publishes to dataplane and registers the app with the controller (draft)
|
|
7
|
+
* - delete <systemKey> – Delete external system and associated datasources from dataplane
|
|
8
8
|
* - test-integration <app> – Run integration tests (builder: in container; external: via dataplane pipeline)
|
|
9
9
|
*
|
|
10
10
|
* @fileoverview External system command definitions for AI Fabrix Builder CLI
|
|
@@ -15,10 +15,11 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
const { handleCommandError } = require('../utils/cli-utils');
|
|
18
|
+
const { TEST_INTEGRATION_HELP_AFTER } = require('./setup-app.help');
|
|
18
19
|
|
|
19
20
|
function setupDownloadCommand(program) {
|
|
20
|
-
program.command('download <
|
|
21
|
-
.description('
|
|
21
|
+
program.command('download <systemKey>')
|
|
22
|
+
.description('Pull external system from dataplane into integration/<key>/')
|
|
22
23
|
.option('--format <format>', 'Output format: json | yaml (default: yaml or config format)')
|
|
23
24
|
.option('--dry-run', 'Show what would be downloaded without actually downloading')
|
|
24
25
|
.option('--force', 'Overwrite existing README.md without prompting')
|
|
@@ -39,13 +40,24 @@ function setupDownloadCommand(program) {
|
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
function setupUploadCommand(program) {
|
|
42
|
-
program.command('upload <
|
|
43
|
-
.description('
|
|
43
|
+
program.command('upload <systemKey>')
|
|
44
|
+
.description('Validate, publish to dataplane, and register with controller (draft application)')
|
|
44
45
|
.option('--dry-run', 'Validate and build payload only; no API calls')
|
|
46
|
+
.option('-v, --verbose', 'Run server-side pipeline validate and print warnings before publish')
|
|
47
|
+
.option('--probe', 'After publish, run dataplane runtime checks (validation/run); slower')
|
|
48
|
+
.option('--minimal', 'Print only a short readiness summary after upload')
|
|
49
|
+
.option('--probe-timeout <ms>', 'Timeout for --probe (default: 120000)', '120000')
|
|
45
50
|
.action(async(systemKey, options) => {
|
|
46
51
|
try {
|
|
47
52
|
const upload = require('../commands/upload');
|
|
48
|
-
|
|
53
|
+
const probeTimeout =
|
|
54
|
+
options.probeTimeout === undefined || options.probeTimeout === null
|
|
55
|
+
? 120000
|
|
56
|
+
: Number(options.probeTimeout);
|
|
57
|
+
await upload.uploadExternalSystem(systemKey, {
|
|
58
|
+
...options,
|
|
59
|
+
probeTimeout: Number.isFinite(probeTimeout) ? probeTimeout : 120000
|
|
60
|
+
});
|
|
49
61
|
} catch (error) {
|
|
50
62
|
handleCommandError(error, 'upload');
|
|
51
63
|
process.exit(1);
|
|
@@ -54,9 +66,9 @@ function setupUploadCommand(program) {
|
|
|
54
66
|
}
|
|
55
67
|
|
|
56
68
|
function setupDeleteCommand(program) {
|
|
57
|
-
program.command('delete <
|
|
58
|
-
.description('
|
|
59
|
-
.option('--type <type>', 'Application type (default: external; use "external" to target integration/<
|
|
69
|
+
program.command('delete <systemKey>')
|
|
70
|
+
.description('Remove external system and its datasources from dataplane')
|
|
71
|
+
.option('--type <type>', 'Application type (default: external; use "external" to target integration/<systemKey>)')
|
|
60
72
|
.option('--yes', 'Skip confirmation prompt')
|
|
61
73
|
.option('--force', 'Skip confirmation prompt (alias for --yes)')
|
|
62
74
|
.action(async(systemKey, options) => {
|
|
@@ -111,9 +123,15 @@ async function tryBuilderTestIntegration(appName, options) {
|
|
|
111
123
|
*/
|
|
112
124
|
async function runExternalSystemTestIntegration(appName, options) {
|
|
113
125
|
const test = require('../external-system/test');
|
|
114
|
-
const opts = {
|
|
126
|
+
const opts = {
|
|
127
|
+
...options,
|
|
128
|
+
environment: options.env || options.environment,
|
|
129
|
+
debug: options.debug,
|
|
130
|
+
perDatasource: options.perDatasource,
|
|
131
|
+
sync: options.sync === true
|
|
132
|
+
};
|
|
115
133
|
const results = await test.testExternalSystemIntegration(appName, opts);
|
|
116
|
-
test.displayIntegrationTestResults(results, options.verbose);
|
|
134
|
+
test.displayIntegrationTestResults(results, options.verbose, { debug: options.debug, runType: 'integration' });
|
|
117
135
|
if (!results.success) process.exit(1);
|
|
118
136
|
}
|
|
119
137
|
|
|
@@ -126,6 +144,12 @@ async function runExternalSystemTestIntegration(appName, options) {
|
|
|
126
144
|
async function runTestIntegrationCommand(appName, options) {
|
|
127
145
|
const pathsUtil = require('../utils/paths');
|
|
128
146
|
const appType = await pathsUtil.detectAppType(appName).catch(() => null);
|
|
147
|
+
if (options.sync === true && appType && appType.baseDir === 'builder') {
|
|
148
|
+
throw new Error(
|
|
149
|
+
'Option --sync applies only to external integration tests (integration/<systemKey>/). ' +
|
|
150
|
+
'For a builder app use aifabrix upload <systemKey> from the integration folder, or run test-integration without --sync.'
|
|
151
|
+
);
|
|
152
|
+
}
|
|
129
153
|
if (appType && appType.baseDir === 'builder') {
|
|
130
154
|
const { runAppTestIntegration } = require('../commands/app-test');
|
|
131
155
|
const opts = { env: options.env || options.environment || 'dev' };
|
|
@@ -133,23 +157,39 @@ async function runTestIntegrationCommand(appName, options) {
|
|
|
133
157
|
return;
|
|
134
158
|
}
|
|
135
159
|
const ranBuilder = await tryBuilderTestIntegration(appName, options);
|
|
136
|
-
if (ranBuilder)
|
|
160
|
+
if (ranBuilder) {
|
|
161
|
+
if (options.sync === true) {
|
|
162
|
+
throw new Error(
|
|
163
|
+
'Option --sync applies only when test-integration runs against an external integration folder on the dataplane. ' +
|
|
164
|
+
'This run used a builder-style path instead. Remove --sync or use an integration/<systemKey>/ app.'
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
137
169
|
await runExternalSystemTestIntegration(appName, options);
|
|
138
170
|
}
|
|
139
171
|
|
|
140
172
|
function setupExternalSystemTestCommands(program) {
|
|
141
173
|
// 'test <app>' is registered in setup-app.js and dispatches by app type (builder vs external)
|
|
142
174
|
program.command('test-integration <app>')
|
|
143
|
-
.description('
|
|
144
|
-
.option('-
|
|
145
|
-
.option('-p, --payload <file>', 'Path to custom test payload file')
|
|
146
|
-
.option('-e, --env <env>', 'Environment: dev, tst, or pro (default: from aifabrix auth config)')
|
|
175
|
+
.description('Integration tests: builder in container; external via dataplane')
|
|
176
|
+
.option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
|
|
147
177
|
.option('-v, --verbose', 'Show detailed test output')
|
|
148
|
-
.option('--debug', 'Include debug output and write log to integration/<
|
|
149
|
-
.option(
|
|
150
|
-
|
|
178
|
+
.option('-d, --debug', 'Include debug output and write log to integration/<systemKey>/logs/')
|
|
179
|
+
.option(
|
|
180
|
+
'--sync',
|
|
181
|
+
'Publish local system and datasource files to the dataplane before running tests (same as aifabrix upload <systemKey>)'
|
|
182
|
+
)
|
|
183
|
+
.addHelpText('after', TEST_INTEGRATION_HELP_AFTER)
|
|
184
|
+
.action(async(appName, options, cmd) => {
|
|
151
185
|
try {
|
|
152
|
-
|
|
186
|
+
const rawArgs = Array.isArray(cmd?.rawArgs) ? cmd.rawArgs : [];
|
|
187
|
+
const envExplicit = rawArgs.includes('-e') || rawArgs.includes('--env');
|
|
188
|
+
const opts = {
|
|
189
|
+
...options,
|
|
190
|
+
env: envExplicit ? options.env : undefined
|
|
191
|
+
};
|
|
192
|
+
await runTestIntegrationCommand(appName, opts);
|
|
153
193
|
} catch (error) {
|
|
154
194
|
handleCommandError(error, 'test-integration');
|
|
155
195
|
process.exit(1);
|