@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
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attach token, path, format, and scoped-resources helpers to config exports.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Keeps lib/core/config.js under max-lines
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {object} exportsObj - Module exports object to mutate
|
|
13
|
+
* @param {object} deps
|
|
14
|
+
* @param {Function} deps.getConfig
|
|
15
|
+
* @param {Function} deps.saveConfig
|
|
16
|
+
* @param {Function} deps.getSecretsEncryptionKey
|
|
17
|
+
* @param {Function} deps.encryptTokenValue
|
|
18
|
+
* @param {Function} deps.decryptTokenValue
|
|
19
|
+
*/
|
|
20
|
+
function attachConfigExtensions(exportsObj, deps) {
|
|
21
|
+
const { getConfig, saveConfig, getSecretsEncryptionKey, encryptTokenValue, decryptTokenValue } = deps;
|
|
22
|
+
|
|
23
|
+
const { createTokenManagementFunctions } = require('../utils/config-tokens');
|
|
24
|
+
Object.assign(
|
|
25
|
+
exportsObj,
|
|
26
|
+
createTokenManagementFunctions({
|
|
27
|
+
getConfigFn: getConfig,
|
|
28
|
+
saveConfigFn: saveConfig,
|
|
29
|
+
getSecretsEncryptionKeyFn: getSecretsEncryptionKey,
|
|
30
|
+
encryptTokenValueFn: encryptTokenValue,
|
|
31
|
+
decryptTokenValueFn: decryptTokenValue,
|
|
32
|
+
isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
|
|
33
|
+
})
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const { createPathConfigFunctions } = require('../utils/config-paths');
|
|
37
|
+
Object.assign(exportsObj, createPathConfigFunctions(getConfig, saveConfig));
|
|
38
|
+
|
|
39
|
+
const { createFormatFunctions } = require('../utils/config-format-preference');
|
|
40
|
+
Object.assign(exportsObj, createFormatFunctions(getConfig, saveConfig));
|
|
41
|
+
|
|
42
|
+
const { createScopedResourcesPreferenceFunctions } = require('../utils/config-scoped-resources-preference');
|
|
43
|
+
Object.assign(exportsObj, createScopedResourcesPreferenceFunctions(getConfig, saveConfig));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
module.exports = { attachConfigExtensions };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves config.yaml directory/file on each access (aligned with paths.getConfigDirForPaths).
|
|
3
|
+
* Split from config.js for max-lines compliance.
|
|
4
|
+
*
|
|
5
|
+
* @fileoverview Dynamic CONFIG_DIR / CONFIG_FILE for lib/core/config.js
|
|
6
|
+
* @author AI Fabrix Team
|
|
7
|
+
* @version 2.0.0
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const { getAifabrixRuntimeConfigDir } = require('../utils/aifabrix-runtime-config-dir');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @returns {string}
|
|
17
|
+
*/
|
|
18
|
+
function getRuntimeConfigDir() {
|
|
19
|
+
return getAifabrixRuntimeConfigDir();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
function getRuntimeConfigFile() {
|
|
26
|
+
return path.join(getRuntimeConfigDir(), 'config.yaml');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = { getRuntimeConfigDir, getRuntimeConfigFile };
|
package/lib/core/config.js
CHANGED
|
@@ -13,31 +13,10 @@ const path = require('path');
|
|
|
13
13
|
const yaml = require('js-yaml');
|
|
14
14
|
const os = require('os');
|
|
15
15
|
const { encryptToken, decryptToken, isTokenEncrypted } = require('../utils/token-encryption');
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
// 3. ~/.aifabrix
|
|
21
|
-
// Set AIFABRIX_HOME=/workspace/.aifabrix or AIFABRIX_CONFIG=/workspace/.aifabrix/config.yaml when config is not in default home.
|
|
22
|
-
|
|
23
|
-
function getConfigDir() {
|
|
24
|
-
const configFile = process.env.AIFABRIX_CONFIG && typeof process.env.AIFABRIX_CONFIG === 'string';
|
|
25
|
-
if (configFile) {
|
|
26
|
-
return path.dirname(path.resolve(process.env.AIFABRIX_CONFIG.trim()));
|
|
27
|
-
}
|
|
28
|
-
if (process.env.AIFABRIX_HOME && typeof process.env.AIFABRIX_HOME === 'string') {
|
|
29
|
-
return path.resolve(process.env.AIFABRIX_HOME.trim());
|
|
30
|
-
}
|
|
31
|
-
return path.join(os.homedir(), '.aifabrix');
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Runtime config directory and file (respect AIFABRIX_HOME)
|
|
35
|
-
const RUNTIME_CONFIG_DIR = getConfigDir();
|
|
36
|
-
const RUNTIME_CONFIG_FILE = path.join(RUNTIME_CONFIG_DIR, 'config.yaml');
|
|
37
|
-
|
|
38
|
-
// Legacy exports (same as runtime when module loads)
|
|
39
|
-
const CONFIG_DIR = RUNTIME_CONFIG_DIR;
|
|
40
|
-
const CONFIG_FILE = RUNTIME_CONFIG_FILE;
|
|
16
|
+
const { ensureSecureFilePermissions, ensureSecureDirPermissions } = require('../utils/secure-file-permissions');
|
|
17
|
+
const { getRuntimeConfigDir, getRuntimeConfigFile } = require('./config-runtime-paths');
|
|
18
|
+
// Avoid importing paths.js here to prevent circular dependency; use shared runtime config dir helper.
|
|
19
|
+
// Config location: AIFABRIX_CONFIG dirname → AIFABRIX_HOME (with ~/.aifabrix fallback when config lives there) → ~/.aifabrix
|
|
41
20
|
|
|
42
21
|
// Cache for developer ID - loaded when getConfig() is first called
|
|
43
22
|
let cachedDeveloperId = null;
|
|
@@ -110,8 +89,11 @@ function applyConfigDefaults(config) {
|
|
|
110
89
|
if (typeof config.device !== 'object' || config.device === null) {
|
|
111
90
|
config.device = {};
|
|
112
91
|
}
|
|
92
|
+
if (typeof config.useEnvironmentScopedResources === 'undefined') {
|
|
93
|
+
config.useEnvironmentScopedResources = false;
|
|
94
|
+
}
|
|
113
95
|
// Ensure controller field exists (but don't set defaults)
|
|
114
|
-
// It will be set by login or auth
|
|
96
|
+
// It will be set by login or auth --set-controller
|
|
115
97
|
return config;
|
|
116
98
|
}
|
|
117
99
|
|
|
@@ -127,13 +109,18 @@ function getDefaultConfig() {
|
|
|
127
109
|
controller: undefined,
|
|
128
110
|
environments: {},
|
|
129
111
|
device: {},
|
|
130
|
-
format: undefined
|
|
112
|
+
format: undefined,
|
|
113
|
+
useEnvironmentScopedResources: false
|
|
131
114
|
};
|
|
132
115
|
}
|
|
133
116
|
|
|
134
117
|
async function getConfig() {
|
|
135
118
|
try {
|
|
136
|
-
const
|
|
119
|
+
const dir = getRuntimeConfigDir();
|
|
120
|
+
const file = getRuntimeConfigFile();
|
|
121
|
+
ensureSecureDirPermissions(dir);
|
|
122
|
+
ensureSecureFilePermissions(file);
|
|
123
|
+
const configContent = await fs.readFile(file, 'utf8');
|
|
137
124
|
let config = yaml.load(configContent);
|
|
138
125
|
|
|
139
126
|
// Handle empty file or null/undefined result from yaml.load
|
|
@@ -165,20 +152,22 @@ async function getConfig() {
|
|
|
165
152
|
*/
|
|
166
153
|
async function saveConfig(data) {
|
|
167
154
|
try {
|
|
155
|
+
const dir = getRuntimeConfigDir();
|
|
156
|
+
const file = getRuntimeConfigFile();
|
|
168
157
|
// Create directory if it doesn't exist
|
|
169
|
-
await fs.mkdir(
|
|
158
|
+
await fs.mkdir(dir, { recursive: true });
|
|
170
159
|
|
|
171
160
|
// Set secure permissions
|
|
172
161
|
// Force quotes to ensure numeric-like strings (e.g., "01") remain strings in YAML
|
|
173
162
|
const configContent = yaml.dump(data, { forceQuotes: true });
|
|
174
163
|
// Write file first
|
|
175
|
-
await fs.writeFile(
|
|
164
|
+
await fs.writeFile(file, configContent, {
|
|
176
165
|
mode: 0o600,
|
|
177
166
|
flag: 'w'
|
|
178
167
|
});
|
|
179
168
|
// Open file descriptor and fsync to ensure write is flushed to disk
|
|
180
169
|
// This is critical on Windows where file writes may be cached
|
|
181
|
-
const fd = await fs.open(
|
|
170
|
+
const fd = await fs.open(file, 'r+');
|
|
182
171
|
try {
|
|
183
172
|
await fd.sync();
|
|
184
173
|
} finally {
|
|
@@ -195,7 +184,7 @@ async function saveConfig(data) {
|
|
|
195
184
|
*/
|
|
196
185
|
async function clearConfig() {
|
|
197
186
|
try {
|
|
198
|
-
await fs.unlink(
|
|
187
|
+
await fs.unlink(getRuntimeConfigFile());
|
|
199
188
|
} catch (error) {
|
|
200
189
|
if (error.code !== 'ENOENT') {
|
|
201
190
|
throw new Error(`Failed to clear config: ${error.message}`);
|
|
@@ -233,7 +222,9 @@ async function getDeveloperId() {
|
|
|
233
222
|
*/
|
|
234
223
|
async function verifyDeveloperIdSaved(devIdString) {
|
|
235
224
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
236
|
-
const
|
|
225
|
+
const file = getRuntimeConfigFile();
|
|
226
|
+
ensureSecureFilePermissions(file);
|
|
227
|
+
const savedContent = await fs.readFile(file, 'utf8');
|
|
237
228
|
const savedConfig = yaml.load(savedContent);
|
|
238
229
|
const savedDevIdString = String(savedConfig['developer-id']);
|
|
239
230
|
if (savedDevIdString !== devIdString) {
|
|
@@ -258,6 +249,24 @@ async function getCurrentEnvironment() {
|
|
|
258
249
|
return config.environment || 'dev';
|
|
259
250
|
}
|
|
260
251
|
|
|
252
|
+
/**
|
|
253
|
+
* Whether infra TLS mode is enabled (`tlsEnabled: true` in config.yaml; e.g. after `up-infra --tls`).
|
|
254
|
+
* @returns {Promise<boolean>}
|
|
255
|
+
*/
|
|
256
|
+
async function getTlsEnabled() {
|
|
257
|
+
const cfg = await getConfig();
|
|
258
|
+
return cfg.tlsEnabled === true;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Whether Traefik is enabled (`traefik: true` in config; infra compose includes the proxy).
|
|
263
|
+
* @returns {Promise<boolean>}
|
|
264
|
+
*/
|
|
265
|
+
async function getTraefikEnabled() {
|
|
266
|
+
const cfg = await getConfig();
|
|
267
|
+
return cfg.traefik === true;
|
|
268
|
+
}
|
|
269
|
+
|
|
261
270
|
/**
|
|
262
271
|
* Resolve environment from configuration
|
|
263
272
|
* Uses config.environment, defaults to 'dev'
|
|
@@ -427,11 +436,11 @@ async function getSecretsPath() {
|
|
|
427
436
|
}
|
|
428
437
|
|
|
429
438
|
async function setSecretsPath(secretsPath) {
|
|
430
|
-
if (
|
|
439
|
+
if (typeof secretsPath !== 'string') {
|
|
431
440
|
throw new Error('Secrets path is required and must be a string');
|
|
432
441
|
}
|
|
433
442
|
const config = await getConfig();
|
|
434
|
-
config['aifabrix-secrets'] = secretsPath;
|
|
443
|
+
config['aifabrix-secrets'] = secretsPath.trim() || undefined;
|
|
435
444
|
await saveConfig(config);
|
|
436
445
|
}
|
|
437
446
|
|
|
@@ -444,6 +453,8 @@ const exportsObj = {
|
|
|
444
453
|
setDeveloperId,
|
|
445
454
|
loadDeveloperId,
|
|
446
455
|
getCurrentEnvironment,
|
|
456
|
+
getTlsEnabled,
|
|
457
|
+
getTraefikEnabled,
|
|
447
458
|
setCurrentEnvironment,
|
|
448
459
|
resolveEnvironment,
|
|
449
460
|
isTokenExpired,
|
|
@@ -458,8 +469,12 @@ const exportsObj = {
|
|
|
458
469
|
normalizeControllerUrl,
|
|
459
470
|
setControllerUrl,
|
|
460
471
|
getControllerUrl,
|
|
461
|
-
CONFIG_DIR
|
|
462
|
-
|
|
472
|
+
get CONFIG_DIR() {
|
|
473
|
+
return getRuntimeConfigDir();
|
|
474
|
+
},
|
|
475
|
+
get CONFIG_FILE() {
|
|
476
|
+
return getRuntimeConfigFile();
|
|
477
|
+
}
|
|
463
478
|
};
|
|
464
479
|
|
|
465
480
|
// Add developerId as a property getter for direct access
|
|
@@ -473,26 +488,12 @@ Object.defineProperty(exportsObj, 'developerId', {
|
|
|
473
488
|
configurable: true
|
|
474
489
|
});
|
|
475
490
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
decryptTokenValueFn: decryptTokenValue,
|
|
484
|
-
isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
|
|
491
|
+
const { attachConfigExtensions } = require('./config-attach-extensions');
|
|
492
|
+
attachConfigExtensions(exportsObj, {
|
|
493
|
+
getConfig,
|
|
494
|
+
saveConfig,
|
|
495
|
+
getSecretsEncryptionKey,
|
|
496
|
+
encryptTokenValue,
|
|
497
|
+
decryptTokenValue
|
|
485
498
|
});
|
|
486
|
-
Object.assign(exportsObj, tokenFunctions);
|
|
487
|
-
|
|
488
|
-
// Path configuration functions - created after getConfig/saveConfig are defined
|
|
489
|
-
const { createPathConfigFunctions } = require('../utils/config-paths');
|
|
490
|
-
const pathConfigFunctions = createPathConfigFunctions(getConfig, saveConfig);
|
|
491
|
-
Object.assign(exportsObj, pathConfigFunctions);
|
|
492
|
-
|
|
493
|
-
// Format preference functions
|
|
494
|
-
const { createFormatFunctions } = require('../utils/config-format-preference');
|
|
495
|
-
const formatFunctions = createFormatFunctions(getConfig, saveConfig);
|
|
496
|
-
Object.assign(exportsObj, formatFunctions);
|
|
497
|
-
|
|
498
499
|
module.exports = exportsObj;
|
package/lib/core/diff.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
|
|
1
2
|
/**
|
|
2
3
|
* File Comparison Utilities
|
|
3
4
|
*
|
|
@@ -377,7 +378,7 @@ function displayVersionInfo(diffResult) {
|
|
|
377
378
|
*/
|
|
378
379
|
function displayBreakingChanges(breakingChanges) {
|
|
379
380
|
if (breakingChanges.length > 0) {
|
|
380
|
-
logger.log(chalk.red('\n
|
|
381
|
+
logger.log(chalk.red('\n⚠ Breaking Changes:'));
|
|
381
382
|
breakingChanges.forEach(change => {
|
|
382
383
|
logger.log(chalk.red(` • ${change.description}`));
|
|
383
384
|
});
|
|
@@ -445,7 +446,7 @@ function formatDiffOutput(diffResult) {
|
|
|
445
446
|
logger.log(chalk.blue(`\nComparing: ${diffResult.file1} ↔ ${diffResult.file2}`));
|
|
446
447
|
|
|
447
448
|
if (diffResult.identical) {
|
|
448
|
-
logger.log(
|
|
449
|
+
logger.log(formatSuccessParagraph('Files are identical'));
|
|
449
450
|
return;
|
|
450
451
|
}
|
|
451
452
|
|
|
@@ -12,7 +12,6 @@ const fs = require('fs');
|
|
|
12
12
|
const yaml = require('js-yaml');
|
|
13
13
|
const crypto = require('crypto');
|
|
14
14
|
const pathsUtil = require('../utils/paths');
|
|
15
|
-
const { saveLocalSecret } = require('../utils/local-secrets');
|
|
16
15
|
|
|
17
16
|
const ENCRYPTION_KEY = 'secrets-encryptionKeyVault';
|
|
18
17
|
|
|
@@ -30,7 +29,7 @@ function readKeyFromFile(filePath) {
|
|
|
30
29
|
|
|
31
30
|
/**
|
|
32
31
|
* Ensure secrets encryption key exists. If config already has it, do nothing.
|
|
33
|
-
* If key exists in user or project secrets file, set config. Otherwise generate
|
|
32
|
+
* If key exists in user or project secrets file, set config. Otherwise generate and store only in config (not in secrets file).
|
|
34
33
|
* @param {Object} config - Config module (getSecretsEncryptionKey, setSecretsEncryptionKey, getSecretsPath)
|
|
35
34
|
* @returns {Promise<void>}
|
|
36
35
|
*/
|
|
@@ -38,7 +37,7 @@ async function ensureSecretsEncryptionKey(config) {
|
|
|
38
37
|
const existing = await config.getSecretsEncryptionKey();
|
|
39
38
|
if (existing) return;
|
|
40
39
|
|
|
41
|
-
const userSecretsPath =
|
|
40
|
+
const userSecretsPath = pathsUtil.getPrimaryUserSecretsLocalPath();
|
|
42
41
|
const projectSecretsPath = await config.getSecretsPath();
|
|
43
42
|
|
|
44
43
|
let key = readKeyFromFile(userSecretsPath);
|
|
@@ -49,7 +48,6 @@ async function ensureSecretsEncryptionKey(config) {
|
|
|
49
48
|
}
|
|
50
49
|
|
|
51
50
|
const newKey = crypto.randomBytes(32).toString('hex');
|
|
52
|
-
await saveLocalSecret(ENCRYPTION_KEY, newKey);
|
|
53
51
|
await config.setSecretsEncryptionKey(newKey);
|
|
54
52
|
}
|
|
55
53
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infra catalog helpers for secrets-ensure (placeholder context, empty-allowed keys, up-infra key list).
|
|
3
|
+
* @fileoverview Split from secrets-ensure.js for max-lines compliance
|
|
4
|
+
*/
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const logger = require('../utils/logger');
|
|
9
|
+
const pathsUtil = require('../utils/paths');
|
|
10
|
+
const { getAllInfraEnsureKeys } = require('../parameters/infra-kv-discovery');
|
|
11
|
+
|
|
12
|
+
/** Shipped infra.parameter.yaml (matches infra-parameter-catalog DEFAULT_CATALOG_PATH). Local join so partial Jest mocks cannot omit DEFAULT_CATALOG_PATH. */
|
|
13
|
+
const BUNDLED_INFRA_PARAMETER_YAML = path.join(__dirname, '..', 'schema', 'infra.parameter.yaml');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Lazy require so Jest mocks of infra-parameter-catalog apply when this module loads after mocks.
|
|
17
|
+
* @returns {typeof import('../parameters/infra-parameter-catalog')}
|
|
18
|
+
*/
|
|
19
|
+
function infraParameterCatalogModule() {
|
|
20
|
+
return require('../parameters/infra-parameter-catalog');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Merge infra.parameter.yaml defaults with up-infra CLI options for {{placeholder}} expansion.
|
|
25
|
+
* @param {Object} [options]
|
|
26
|
+
* @returns {Record<string, string>}
|
|
27
|
+
*/
|
|
28
|
+
function buildInfraPlaceholderContext(options) {
|
|
29
|
+
const cat = infraParameterCatalogModule();
|
|
30
|
+
try {
|
|
31
|
+
return cat.mergeInfraParameterDefaultsForCli(cat.getInfraParameterCatalog().data, options || {});
|
|
32
|
+
} catch {
|
|
33
|
+
return cat.mergeInfraParameterDefaultsForCli({}, options || {});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Keys that may stay empty without backfill (catalog generator emptyAllowed).
|
|
39
|
+
* @param {string} key - Secret key
|
|
40
|
+
* @returns {boolean}
|
|
41
|
+
*/
|
|
42
|
+
function isSecretKeyAllowedEmpty(key) {
|
|
43
|
+
const cat = infraParameterCatalogModule();
|
|
44
|
+
try {
|
|
45
|
+
return cat.getInfraParameterCatalog().isKeyAllowedEmpty(key);
|
|
46
|
+
} catch {
|
|
47
|
+
const emptyAllowed = cat.readRelaxedEmptyAllowedKeySet(BUNDLED_INFRA_PARAMETER_YAML);
|
|
48
|
+
return Boolean(emptyAllowed && emptyAllowed.has(key));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Infra secret keys for up-infra: catalog (ensureOn upInfra) + workspace DB/template discovery
|
|
54
|
+
* + standard miso-controller multi-DB keys.
|
|
55
|
+
* @returns {string[]}
|
|
56
|
+
*/
|
|
57
|
+
function getInfraSecretKeysForUpInfra() {
|
|
58
|
+
const cat = infraParameterCatalogModule();
|
|
59
|
+
try {
|
|
60
|
+
const catalog = cat.getInfraParameterCatalog();
|
|
61
|
+
return getAllInfraEnsureKeys(catalog, pathsUtil);
|
|
62
|
+
} catch (err) {
|
|
63
|
+
logger.warn(`Could not build infra secret key list from catalog (${err.message}); using relaxed YAML read.`);
|
|
64
|
+
const relaxed = cat.readRelaxedUpInfraEnsureKeyList(BUNDLED_INFRA_PARAMETER_YAML);
|
|
65
|
+
if (relaxed && relaxed.length > 0) {
|
|
66
|
+
return relaxed;
|
|
67
|
+
}
|
|
68
|
+
logger.warn('Relaxed read of infra.parameter.yaml produced no keys; up-infra may skip secret backfill.');
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = {
|
|
74
|
+
buildInfraPlaceholderContext,
|
|
75
|
+
isSecretKeyAllowedEmpty,
|
|
76
|
+
getInfraSecretKeysForUpInfra
|
|
77
|
+
};
|