@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.
- package/.cursor/rules/anchor-docs.mdc +15 -0
- package/.cursor/rules/cli-layout.mdc +75 -0
- package/.cursor/rules/project-rules.mdc +8 -0
- package/.npmrc.token +1 -0
- package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
- package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/README.md +1 -1
- 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 +31 -0
- package/integration/hubspot-test/create-hubspot.js +5 -5
- package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
- package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
- package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
- package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
- package/integration/hubspot-test/test-dataplane-down.js +3 -3
- package/integration/hubspot-test/test.js +35 -43
- 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 +301 -0
- package/lib/api/certificates.api.js +62 -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 +11 -3
- package/lib/api/pipeline.api.js +67 -20
- package/lib/api/types/certificates.types.js +48 -0
- package/lib/api/types/dev.types.js +4 -3
- package/lib/api/types/pipeline.types.js +8 -5
- package/lib/api/types/validation-run.types.js +56 -0
- package/lib/api/validation-run.api.js +111 -0
- package/lib/api/validation-runner.js +109 -0
- package/lib/app/certification-show-enrich.js +129 -0
- package/lib/app/certification-verify-rows.js +60 -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 +16 -7
- package/lib/app/rotate-secret.js +14 -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 +44 -1
- package/lib/app/show.js +93 -9
- package/lib/build/index.js +13 -10
- package/lib/certification/cli-cert-sync-skip.js +21 -0
- package/lib/certification/merge-certification-from-artifact.js +185 -0
- package/lib/certification/post-unified-cert-sync.js +33 -0
- package/lib/certification/sync-after-external-command.js +52 -0
- package/lib/certification/sync-system-certification.js +197 -0
- package/lib/cli/index.js +2 -0
- package/lib/cli/setup-app.help.js +67 -0
- package/lib/cli/setup-app.js +61 -121
- package/lib/cli/setup-app.test-commands.js +195 -0
- package/lib/cli/setup-auth.js +19 -5
- 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 +170 -113
- package/lib/cli/setup-environment.js +7 -1
- package/lib/cli/setup-external-system.js +84 -23
- package/lib/cli/setup-infra.js +126 -47
- package/lib/cli/setup-parameters.js +32 -0
- package/lib/cli/setup-secrets.js +137 -18
- package/lib/cli/setup-service-user.js +1 -1
- package/lib/cli/setup-utility.js +54 -22
- 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 +32 -11
- package/lib/commands/auth-config.js +6 -6
- 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 +428 -0
- package/lib/commands/datasource-unified-test-cli.options.js +191 -0
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
- package/lib/commands/datasource-validation-cli.js +143 -0
- package/lib/commands/datasource.js +125 -95
- 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 +2 -2
- package/lib/commands/repair.js +21 -3
- package/lib/commands/secrets-list.js +23 -12
- package/lib/commands/secrets-remove-all.js +220 -0
- package/lib/commands/secrets-remove.js +21 -12
- package/lib/commands/secrets-set.js +21 -12
- package/lib/commands/secrets-validate.js +4 -4
- package/lib/commands/secure.js +10 -9
- package/lib/commands/service-user.js +26 -25
- package/lib/commands/test-e2e-external.js +27 -1
- package/lib/commands/up-common.js +3 -2
- package/lib/commands/up-dataplane.js +29 -16
- package/lib/commands/up-miso.js +19 -29
- package/lib/commands/upload.js +149 -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 +14 -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 +55 -56
- package/lib/core/diff.js +3 -2
- package/lib/core/ensure-encryption-key.js +1 -1
- 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 +200 -37
- package/lib/core/templates-env.js +4 -3
- package/lib/datasource/abac-validator.js +1 -10
- package/lib/datasource/deploy.js +75 -53
- package/lib/datasource/field-reference-validator.js +9 -6
- package/lib/datasource/integration-context.js +63 -0
- package/lib/datasource/list.js +8 -7
- package/lib/datasource/log-viewer.js +189 -67
- package/lib/datasource/resolve-app.js +4 -4
- package/lib/datasource/test-e2e.js +113 -146
- package/lib/datasource/test-integration.js +114 -122
- package/lib/datasource/unified-validation-run-body.js +68 -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 +93 -0
- package/lib/datasource/validate.js +157 -13
- 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 +166 -53
- package/lib/external-system/download-helpers.js +1 -1
- package/lib/external-system/download.js +7 -6
- package/lib/external-system/generator.js +92 -6
- 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.js +16 -4
- package/lib/generator/helpers.js +58 -3
- package/lib/generator/index.js +4 -0
- package/lib/generator/split-readme.js +12 -7
- package/lib/generator/split-variables.js +2 -1
- package/lib/generator/split.js +1 -1
- package/lib/generator/wizard-readme.js +3 -3
- package/lib/generator/wizard.js +8 -8
- package/lib/infrastructure/compose.js +70 -7
- package/lib/infrastructure/helpers-docker-check.js +67 -0
- package/lib/infrastructure/helpers.js +203 -42
- package/lib/infrastructure/index.js +31 -18
- package/lib/infrastructure/services.js +21 -67
- 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 +1200 -442
- package/lib/schema/external-system.schema.json +203 -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 +226 -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 +77 -17
- 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 +166 -7
- package/lib/utils/config-scoped-resources-preference.js +41 -0
- package/lib/utils/configuration-env-resolver.js +11 -8
- package/lib/utils/controller-deployment-outcome.js +68 -0
- package/lib/utils/credential-display.js +2 -2
- package/lib/utils/credential-secrets-env.js +5 -5
- 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-certificate-tty.js +82 -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 +459 -0
- package/lib/utils/datasource-test-run-exit.js +83 -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 +35 -8
- package/lib/utils/env-template.js +2 -2
- package/lib/utils/environment-scoped-resources.js +144 -0
- package/lib/utils/error-formatter.js +92 -13
- 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-readme.js +8 -1
- package/lib/utils/external-system-display.js +242 -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-system-test-tty-overview.js +120 -0
- package/lib/utils/external-system-system-test-tty.js +417 -0
- package/lib/utils/external-system-test-helpers.js +24 -6
- package/lib/utils/external-system-validators.js +30 -12
- package/lib/utils/health-check-url.js +119 -0
- package/lib/utils/health-check.js +59 -25
- package/lib/utils/help-builder.js +11 -8
- 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 +3 -4
- package/lib/utils/paths.js +148 -47
- 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 +169 -49
- package/lib/utils/secrets-helpers.js +70 -59
- package/lib/utils/secrets-kv-scope.js +60 -0
- package/lib/utils/secrets-utils.js +32 -38
- package/lib/utils/secrets-validation.js +3 -1
- package/lib/utils/secrets-yaml-preserve.js +109 -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 +1 -2
- 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 +112 -0
- package/lib/utils/validation-run-post-retry.js +85 -0
- package/lib/utils/validation-run-request.js +116 -0
- package/lib/utils/variable-transformer.js +21 -4
- package/lib/utils/yaml-preserve.js +33 -14
- package/lib/validation/datasource-warnings.js +56 -0
- package/lib/validation/env-template-auth.js +1 -1
- package/lib/validation/external-manifest-validator.js +27 -7
- package/lib/validation/validate-display.js +37 -31
- package/lib/validation/validate-external-cert-sync.js +23 -0
- package/lib/validation/validate.js +8 -14
- package/lib/validation/validator-unresolved-placeholders.js +98 -0
- package/lib/validation/validator.js +22 -65
- package/lib/validation/wizard-config-validator.js +2 -1
- package/package.json +9 -4
- package/scripts/check-datasource-test-run-schema-sync.js +34 -0
- package/scripts/diagnose-cli.js +150 -0
- package/scripts/install-local.js +307 -55
- package/scripts/pnpm-global-remove.js +48 -0
- package/templates/README.md +15 -2
- package/templates/applications/dataplane/application.yaml +52 -2
- package/templates/applications/dataplane/env.template +79 -17
- 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 +42 -12
- 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/external-datasource.yaml.hbs +197 -118
- package/templates/infra/compose.yaml.hbs +33 -16
- package/templates/infra/servers.json.hbs +3 -1
- package/templates/python/docker-compose.hbs +16 -0
- package/templates/typescript/docker-compose.hbs +16 -0
- package/lib/api/external-test.api.js +0 -111
- 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
|
+
|
package/lib/cli/setup-auth.js
CHANGED
|
@@ -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('
|
|
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
|
|
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
|
|
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('
|
|
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('
|
|
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 <
|
|
21
|
-
.description('
|
|
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 <
|
|
33
|
-
.description('Push
|
|
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('
|
|
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('
|
|
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('
|
|
88
|
+
.description('Controller deployments (list)')
|
|
89
|
+
.addHelpText('after', DEPLOYMENT_HELP_AFTER);
|
|
76
90
|
|
|
77
91
|
deployment
|
|
78
92
|
.command('list')
|
|
79
|
-
.description('List
|
|
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 };
|