@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
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
const fs = require('fs');
|
|
13
13
|
const path = require('path');
|
|
14
14
|
const Ajv = require('ajv');
|
|
15
|
+
const addFormats = require('ajv-formats');
|
|
15
16
|
const applicationSchema = require('../schema/application-schema.json');
|
|
16
17
|
const externalSystemSchema = require('../schema/external-system.schema.json');
|
|
17
18
|
const externalDataSourceSchema = require('../schema/external-datasource.schema.json');
|
|
@@ -57,7 +58,8 @@ async function loadVariablesYaml(appName, options = {}) {
|
|
|
57
58
|
* @returns {Function} Compiled validator function
|
|
58
59
|
*/
|
|
59
60
|
function setupAjvValidator() {
|
|
60
|
-
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
61
|
+
const ajv = new Ajv({ allErrors: true, strict: false, verbose: true });
|
|
62
|
+
addFormats(ajv);
|
|
61
63
|
const externalSystemSchemaCopy = { ...externalSystemSchema };
|
|
62
64
|
const externalDataSourceSchemaCopy = { ...externalDataSourceSchema };
|
|
63
65
|
|
|
@@ -65,6 +67,11 @@ function setupAjvValidator() {
|
|
|
65
67
|
delete externalDataSourceSchemaCopy.$schema;
|
|
66
68
|
}
|
|
67
69
|
|
|
70
|
+
// external-datasource.schema.json references these by $id (aifabrix://schema/type/*)
|
|
71
|
+
ajv.addSchema(require('../schema/type/document-storage.json'));
|
|
72
|
+
ajv.addSchema(require('../schema/type/message-service.json'));
|
|
73
|
+
ajv.addSchema(require('../schema/type/vector-store.json'));
|
|
74
|
+
|
|
68
75
|
ajv.addSchema(externalSystemSchemaCopy, externalSystemSchema.$id);
|
|
69
76
|
ajv.addSchema(externalDataSourceSchemaCopy, externalDataSourceSchema.$id);
|
|
70
77
|
return ajv.compile(applicationSchema);
|
|
@@ -341,7 +348,8 @@ function validateDeploymentJson(deployment) {
|
|
|
341
348
|
|
|
342
349
|
// verbose: true includes the actual data value in error objects for better error messages
|
|
343
350
|
const ajv = new Ajv({ allErrors: true, strict: false, verbose: true });
|
|
344
|
-
|
|
351
|
+
addFormats(ajv);
|
|
352
|
+
// Register external schemas with their $id
|
|
345
353
|
// Create copies to avoid modifying the original schemas
|
|
346
354
|
const externalSystemSchemaCopy = { ...externalSystemSchema };
|
|
347
355
|
const externalDataSourceSchemaCopy = { ...externalDataSourceSchema };
|
|
@@ -349,6 +357,10 @@ function validateDeploymentJson(deployment) {
|
|
|
349
357
|
if (externalDataSourceSchemaCopy.$schema && externalDataSourceSchemaCopy.$schema.includes('2020-12')) {
|
|
350
358
|
delete externalDataSourceSchemaCopy.$schema;
|
|
351
359
|
}
|
|
360
|
+
// external-datasource.schema.json references these by $id (aifabrix://schema/type/*)
|
|
361
|
+
ajv.addSchema(require('../schema/type/document-storage.json'));
|
|
362
|
+
ajv.addSchema(require('../schema/type/message-service.json'));
|
|
363
|
+
ajv.addSchema(require('../schema/type/vector-store.json'));
|
|
352
364
|
ajv.addSchema(externalSystemSchemaCopy, externalSystemSchema.$id);
|
|
353
365
|
ajv.addSchema(externalDataSourceSchemaCopy, externalDataSourceSchema.$id);
|
|
354
366
|
const validate = ajv.compile(applicationSchema);
|
|
@@ -356,72 +368,17 @@ function validateDeploymentJson(deployment) {
|
|
|
356
368
|
|
|
357
369
|
return {
|
|
358
370
|
valid,
|
|
359
|
-
errors: valid ? [] : formatValidationErrors(validate.errors
|
|
371
|
+
errors: valid ? [] : formatValidationErrors(validate.errors, {
|
|
372
|
+
deploymentManifest: deployment,
|
|
373
|
+
rootData: deployment
|
|
374
|
+
})
|
|
360
375
|
};
|
|
361
376
|
}
|
|
362
377
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
* Recursively finds all string values in obj that contain ${...} placeholders.
|
|
368
|
-
* Used to ensure deployment manifest has no unresolved variables before deploy.
|
|
369
|
-
*
|
|
370
|
-
* @function findUnresolvedVariablesInObject
|
|
371
|
-
* @param {Object} obj - Object to scan (e.g. deployment manifest)
|
|
372
|
-
* @param {string} [prefix=''] - Path prefix for error reporting
|
|
373
|
-
* @returns {string[]} List of paths with example placeholder (e.g. "port: ${PORT}")
|
|
374
|
-
*
|
|
375
|
-
* @example
|
|
376
|
-
* findUnresolvedVariablesInObject({ port: '${PORT}' }) // ['port: ${PORT}']
|
|
377
|
-
*/
|
|
378
|
-
function findUnresolvedVariablesInObject(obj, prefix = '') {
|
|
379
|
-
const found = [];
|
|
380
|
-
if (obj === null || obj === undefined) {
|
|
381
|
-
return found;
|
|
382
|
-
}
|
|
383
|
-
if (typeof obj === 'string') {
|
|
384
|
-
const matches = obj.match(UNRESOLVED_VAR_REGEX);
|
|
385
|
-
if (matches && matches.length > 0) {
|
|
386
|
-
const pathLabel = prefix || 'value';
|
|
387
|
-
found.push(`${pathLabel}: ${matches[0]}`);
|
|
388
|
-
}
|
|
389
|
-
return found;
|
|
390
|
-
}
|
|
391
|
-
if (Array.isArray(obj)) {
|
|
392
|
-
obj.forEach((item, i) => {
|
|
393
|
-
found.push(...findUnresolvedVariablesInObject(item, `${prefix}[${i}]`));
|
|
394
|
-
});
|
|
395
|
-
return found;
|
|
396
|
-
}
|
|
397
|
-
if (typeof obj === 'object') {
|
|
398
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
399
|
-
const path = prefix ? `${prefix}.${key}` : key;
|
|
400
|
-
found.push(...findUnresolvedVariablesInObject(value, path));
|
|
401
|
-
}
|
|
402
|
-
return found;
|
|
403
|
-
}
|
|
404
|
-
return found;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* Validates that deployment manifest contains no unresolved ${...} variables.
|
|
409
|
-
* Throws if any are found, with a message to use secret variables or literal values.
|
|
410
|
-
*
|
|
411
|
-
* @function validateNoUnresolvedVariablesInDeployment
|
|
412
|
-
* @param {Object} deployment - Deployment manifest object
|
|
413
|
-
* @throws {Error} If any ${...} placeholders are found
|
|
414
|
-
*/
|
|
415
|
-
function validateNoUnresolvedVariablesInDeployment(deployment) {
|
|
416
|
-
const unresolved = findUnresolvedVariablesInObject(deployment);
|
|
417
|
-
if (unresolved.length > 0) {
|
|
418
|
-
const examples = [...new Set(unresolved)].slice(0, 5).join(', ');
|
|
419
|
-
throw new Error(
|
|
420
|
-
`Deployment manifest contains unresolved variables (e.g. ${examples}). ` +
|
|
421
|
-
'Use secret variables (kv://) in env.template for sensitive values, and set the application port as a number in application.yaml.'
|
|
422
|
-
);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
378
|
+
const {
|
|
379
|
+
findUnresolvedVariablesInObject,
|
|
380
|
+
validateNoUnresolvedVariablesInDeployment
|
|
381
|
+
} = require('./validator-unresolved-placeholders');
|
|
425
382
|
|
|
426
383
|
/**
|
|
427
384
|
* Validates all application configuration files
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
1
2
|
/**
|
|
2
3
|
* @fileoverview Wizard configuration validator for wizard.yaml files
|
|
3
4
|
* @author AI Fabrix Team
|
|
@@ -281,7 +282,7 @@ function displayValidationResults(result) {
|
|
|
281
282
|
console.log(chalk.green('Wizard configuration is valid'));
|
|
282
283
|
} else {
|
|
283
284
|
// eslint-disable-next-line no-console
|
|
284
|
-
console.log(
|
|
285
|
+
console.log(formatBlockingError('Wizard configuration validation failed:'));
|
|
285
286
|
result.errors.forEach(error => {
|
|
286
287
|
// eslint-disable-next-line no-console
|
|
287
288
|
console.log(chalk.red(` - ${error}`));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aifabrix/builder",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.44.1",
|
|
4
4
|
"description": "AI Fabrix Local Fabric & Deployment SDK",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"af": "bin/aifabrix.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
+
"all": "npm run precommit && npm run test:manual && npm run test:integration:fixtures && npm run test:hubspot-wizard",
|
|
11
12
|
"test": "node tests/scripts/test-wrapper.js",
|
|
12
13
|
"test:ci": "bash tests/scripts/ci-simulate.sh",
|
|
13
14
|
"test:same-as-github": "npm run build:ci",
|
|
@@ -15,6 +16,7 @@
|
|
|
15
16
|
"test:coverage:nyc": "nyc --reporter=text --reporter=lcov --reporter=html jest --config jest.config.coverage.js --runInBand",
|
|
16
17
|
"test:watch": "jest --watch",
|
|
17
18
|
"test:integration": "jest --config jest.config.integration.js --runInBand",
|
|
19
|
+
"test:integration:fixtures": "jest --config jest.config.integration.fixtures.js --runInBand",
|
|
18
20
|
"test:integration:python": "cross-env TEST_LANGUAGE=python jest --config jest.config.integration.js --runInBand",
|
|
19
21
|
"test:integration:typescript": "cross-env TEST_LANGUAGE=typescript jest --config jest.config.integration.js --runInBand",
|
|
20
22
|
"test:hubspot-wizard": "node integration/hubspot-test/test.js",
|
|
@@ -27,13 +29,16 @@
|
|
|
27
29
|
"lint:ci": "eslint . --ext .js --format json --output-file eslint-report.json",
|
|
28
30
|
"dev": "node bin/aifabrix.js",
|
|
29
31
|
"build": "npm run lint && npm run test",
|
|
30
|
-
"build:ci": "npm run lint && npm run test:ci",
|
|
32
|
+
"build:ci": "npm run lint && npm run check:schema-sync && npm run check:flags && npm run test:ci",
|
|
31
33
|
"pack": "npm run build && npm pack",
|
|
32
34
|
"validate": "npm run build",
|
|
33
35
|
"prepublishOnly": "npm run validate",
|
|
34
36
|
"precommit": "npm run lint:fix && npm run test",
|
|
35
|
-
"install:local": "node scripts/install-local.js",
|
|
36
|
-
"uninstall:local": "node scripts/install-local.js uninstall"
|
|
37
|
+
"install:local": "node scripts/install-local.js && which aifabrix && which af",
|
|
38
|
+
"uninstall:local": "node scripts/install-local.js uninstall && which aifabrix && which af",
|
|
39
|
+
"diagnose:cli": "node scripts/diagnose-cli.js",
|
|
40
|
+
"check:schema-sync": "node scripts/check-datasource-test-run-schema-sync.js",
|
|
41
|
+
"check:flags": "jest tests/lib/schema/flag-map-validation-run.test.js --runInBand --config jest.config.default.js"
|
|
37
42
|
},
|
|
38
43
|
"keywords": [
|
|
39
44
|
"aifabrix",
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CI helper: fail when Builder lib/schema/datasource-test-run.schema.json drifts from Dataplane copy.
|
|
4
|
+
* @fileoverview Schema sync gate (plan §8.1)
|
|
5
|
+
*/
|
|
6
|
+
/* eslint-disable no-console -- CLI script */
|
|
7
|
+
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const { assertDatasourceTestRunSchemasInSync } = require('../lib/utils/datasource-test-run-schema-sync');
|
|
10
|
+
|
|
11
|
+
const root = path.join(__dirname, '..');
|
|
12
|
+
const builderSchema = path.join(root, 'lib/schema/datasource-test-run.schema.json');
|
|
13
|
+
const dpRoot = process.env.AIFABRIX_DATAPLANE_ROOT || path.join(root, '..', 'aifabrix-dataplane');
|
|
14
|
+
const dataplaneSchema = path.join(dpRoot, 'app/schemas/json/datasource-test-run.schema.json');
|
|
15
|
+
|
|
16
|
+
const strict = process.env.AIFABRIX_SCHEMA_SYNC_STRICT === '1';
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
const result = assertDatasourceTestRunSchemasInSync(builderSchema, dataplaneSchema);
|
|
20
|
+
if (result.skipped) {
|
|
21
|
+
const msg = result.reason || 'Dataplane schema path missing';
|
|
22
|
+
if (strict) {
|
|
23
|
+
console.error(`Schema sync failed (strict): ${msg}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
console.warn(`Schema sync skipped: ${msg}`);
|
|
27
|
+
process.exit(0);
|
|
28
|
+
}
|
|
29
|
+
console.log(`DatasourceTestRun schema OK (sha256 ${result.builderSha})`);
|
|
30
|
+
process.exit(0);
|
|
31
|
+
} catch (e) {
|
|
32
|
+
console.error(e.message || String(e));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* List every PATH hit for aifabrix / af and each --version (find duplicate installs).
|
|
6
|
+
*
|
|
7
|
+
* @fileoverview CLI path diagnostic for @aifabrix/builder
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const { execFileSync, execSync } = require('child_process');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Reads package.json `bin` field.
|
|
16
|
+
* @returns {Record<string, string>|string} Bin map or single path string
|
|
17
|
+
*/
|
|
18
|
+
function readBins() {
|
|
19
|
+
const pkgPath = path.join(__dirname, '..', 'package.json');
|
|
20
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
21
|
+
return pkg.bin || { aifabrix: 'bin/aifabrix.js' };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Resolves every PATH directory that exposes an executable named `binName`.
|
|
26
|
+
* @param {string} binName - CLI name (e.g. aifabrix)
|
|
27
|
+
* @returns {Array<{ path: string, real: string }>} Deduped hits with real paths
|
|
28
|
+
*/
|
|
29
|
+
function locationsOnPath(binName) {
|
|
30
|
+
if (process.platform === 'win32') {
|
|
31
|
+
try {
|
|
32
|
+
const out = execSync(`where ${binName}`, {
|
|
33
|
+
encoding: 'utf8',
|
|
34
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
35
|
+
}).trim();
|
|
36
|
+
return out.split(/\r?\n/).filter(Boolean).map((p) => ({ path: p, real: p }));
|
|
37
|
+
} catch {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const dirs = (process.env.PATH || '').split(path.delimiter).filter(Boolean);
|
|
43
|
+
const out = [];
|
|
44
|
+
const seenReal = new Set();
|
|
45
|
+
for (const dir of dirs) {
|
|
46
|
+
const candidate = path.join(dir, binName);
|
|
47
|
+
try {
|
|
48
|
+
const st = fs.lstatSync(candidate);
|
|
49
|
+
if (!st.isFile() && !st.isSymbolicLink()) continue;
|
|
50
|
+
fs.accessSync(candidate, fs.constants.X_OK);
|
|
51
|
+
const real = fs.realpathSync(candidate);
|
|
52
|
+
if (seenReal.has(real)) continue;
|
|
53
|
+
seenReal.add(real);
|
|
54
|
+
out.push({ path: candidate, real });
|
|
55
|
+
} catch {
|
|
56
|
+
// not found or not executable
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Runs `executablePath --version` and returns stdout or null on failure.
|
|
64
|
+
* @param {string} executablePath - Absolute path to the binary
|
|
65
|
+
* @returns {string|null} Trimmed version output
|
|
66
|
+
*/
|
|
67
|
+
function versionAt(executablePath) {
|
|
68
|
+
try {
|
|
69
|
+
return execFileSync(executablePath, ['--version'], {
|
|
70
|
+
encoding: 'utf8',
|
|
71
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
72
|
+
}).trim();
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Prints PNPM_HOME and npm prefix for debugging PATH issues.
|
|
80
|
+
* @returns {void}
|
|
81
|
+
*/
|
|
82
|
+
function printEnvironment() {
|
|
83
|
+
console.log('Environment (relevant to global CLIs)\n');
|
|
84
|
+
console.log(` PNPM_HOME ${process.env.PNPM_HOME || '(not set)'}`);
|
|
85
|
+
try {
|
|
86
|
+
const prefix = execSync('npm config get prefix', {
|
|
87
|
+
encoding: 'utf8',
|
|
88
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
89
|
+
}).trim();
|
|
90
|
+
console.log(` npm prefix ${prefix}`);
|
|
91
|
+
} catch {
|
|
92
|
+
console.log(' npm prefix (could not read)');
|
|
93
|
+
}
|
|
94
|
+
console.log('');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @param {string[]} names - Bin names from package.json
|
|
99
|
+
* @returns {void}
|
|
100
|
+
*/
|
|
101
|
+
function printBinReports(names) {
|
|
102
|
+
for (const name of names) {
|
|
103
|
+
console.log(`── ${name} ──`);
|
|
104
|
+
const hits = locationsOnPath(name);
|
|
105
|
+
if (!hits.length) {
|
|
106
|
+
console.log(' (not found on PATH)\n');
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
hits.forEach((h, i) => {
|
|
110
|
+
const ver = versionAt(h.path);
|
|
111
|
+
const marker = i === 0 ? ' ← first on PATH (what your shell runs)' : '';
|
|
112
|
+
console.log(` [${i + 1}] ${h.path}`);
|
|
113
|
+
if (h.real !== h.path) console.log(` → ${h.real}`);
|
|
114
|
+
console.log(` --version: ${ver ?? '(failed to run)'}${marker}`);
|
|
115
|
+
});
|
|
116
|
+
console.log('');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @param {string[]} names - Bin names from package.json
|
|
122
|
+
* @returns {void}
|
|
123
|
+
*/
|
|
124
|
+
function warnIfMultipleVersions(names) {
|
|
125
|
+
const uniqVersions = new Set();
|
|
126
|
+
for (const name of names) {
|
|
127
|
+
for (const h of locationsOnPath(name)) {
|
|
128
|
+
const v = versionAt(h.path);
|
|
129
|
+
if (v) uniqVersions.add(v);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (uniqVersions.size > 1) {
|
|
133
|
+
console.log('⚠ Multiple distinct --version values above: remove or reorder PATH so only one install remains.');
|
|
134
|
+
console.log(' Often: npm uninstall -g @aifabrix/builder, then ensure PNPM_HOME is before /usr/local/bin in PATH.\n');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Entry: list PATH hits and versions for each package bin.
|
|
140
|
+
* @returns {void}
|
|
141
|
+
*/
|
|
142
|
+
function main() {
|
|
143
|
+
const binField = readBins();
|
|
144
|
+
const names = typeof binField === 'string' ? ['aifabrix'] : Object.keys(binField);
|
|
145
|
+
printEnvironment();
|
|
146
|
+
printBinReports(names);
|
|
147
|
+
warnIfMultipleVersions(names);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
main();
|