@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
package/scripts/install-local.js
CHANGED
|
@@ -10,38 +10,159 @@
|
|
|
10
10
|
* @version 2.0.0
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
const { execSync } = require('child_process');
|
|
13
|
+
const { execSync, execFileSync } = require('child_process');
|
|
14
14
|
const fs = require('fs');
|
|
15
|
+
const os = require('os');
|
|
15
16
|
const path = require('path');
|
|
16
17
|
|
|
18
|
+
const { runPnpmGlobalRemove } = require('./pnpm-global-remove');
|
|
19
|
+
|
|
20
|
+
const PACKAGE_NAME = '@aifabrix/builder';
|
|
21
|
+
/** Primary CLI name used for “current version” before link */
|
|
22
|
+
const PRIMARY_BIN = 'aifabrix';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Default PNPM_HOME when not set in the environment (matches `pnpm setup` on Linux/macOS; Windows uses LOCALAPPDATA).
|
|
26
|
+
* @returns {string} Resolved PNPM global bin home directory
|
|
27
|
+
*/
|
|
28
|
+
function defaultPnpmHome() {
|
|
29
|
+
if (process.env.PNPM_HOME) {
|
|
30
|
+
return process.env.PNPM_HOME;
|
|
31
|
+
}
|
|
32
|
+
if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
|
|
33
|
+
return path.join(process.env.LOCALAPPDATA, 'pnpm');
|
|
34
|
+
}
|
|
35
|
+
return path.join(os.homedir(), '.local', 'share', 'pnpm');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Environment with PNPM_HOME and PATH set so `pnpm link --global` can find the global bin dir
|
|
40
|
+
* (same idea as aifabrix-setup/scripts/install-local.js).
|
|
41
|
+
* @returns {NodeJS.ProcessEnv} Copy of process.env with pnpm paths prepended
|
|
42
|
+
*/
|
|
43
|
+
function pnpmEnv() {
|
|
44
|
+
const env = { ...process.env };
|
|
45
|
+
const pnpmHome = defaultPnpmHome();
|
|
46
|
+
env.PNPM_HOME = pnpmHome;
|
|
47
|
+
env.PATH = [pnpmHome, env.PATH].filter(Boolean).join(path.delimiter);
|
|
48
|
+
return env;
|
|
49
|
+
}
|
|
50
|
+
|
|
17
51
|
/**
|
|
18
52
|
* Detect which package manager is being used (pnpm or npm)
|
|
19
53
|
* @returns {string} 'pnpm' or 'npm'
|
|
20
54
|
*/
|
|
21
55
|
function detectPackageManager() {
|
|
22
56
|
try {
|
|
23
|
-
// Check if pnpm is available
|
|
24
57
|
execSync('which pnpm', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
25
58
|
return 'pnpm';
|
|
26
59
|
} catch {
|
|
27
|
-
// Fall back to npm
|
|
28
60
|
return 'npm';
|
|
29
61
|
}
|
|
30
62
|
}
|
|
31
63
|
|
|
32
64
|
/**
|
|
33
|
-
*
|
|
34
|
-
* @returns {string
|
|
65
|
+
* Reads package.json `bin` keys (or default primary bin).
|
|
66
|
+
* @returns {string[]} CLI executable names published by this package
|
|
35
67
|
*/
|
|
36
|
-
function
|
|
68
|
+
function listCliBinNames() {
|
|
37
69
|
try {
|
|
38
|
-
const
|
|
39
|
-
|
|
70
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
71
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
72
|
+
const bin = packageJson.bin;
|
|
73
|
+
if (!bin) return [PRIMARY_BIN];
|
|
74
|
+
if (typeof bin === 'string') return [PRIMARY_BIN];
|
|
75
|
+
return Object.keys(bin);
|
|
76
|
+
} catch {
|
|
77
|
+
return [PRIMARY_BIN];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @param {string} binName - CLI name on PATH
|
|
83
|
+
* @param {NodeJS.ProcessEnv} [env] - Optional env (e.g. pnpm-adjusted PATH)
|
|
84
|
+
* @returns {string|null} Trimmed `--version` output or null if command fails
|
|
85
|
+
*/
|
|
86
|
+
function getBinVersion(binName, env) {
|
|
87
|
+
try {
|
|
88
|
+
return execSync(`${binName} --version`, {
|
|
89
|
+
encoding: 'utf8',
|
|
90
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
91
|
+
env: env || process.env
|
|
92
|
+
}).trim();
|
|
40
93
|
} catch {
|
|
41
94
|
return null;
|
|
42
95
|
}
|
|
43
96
|
}
|
|
44
97
|
|
|
98
|
+
/**
|
|
99
|
+
* @param {string} binName - CLI name on PATH
|
|
100
|
+
* @param {NodeJS.ProcessEnv} [env] - Optional env for `which`
|
|
101
|
+
* @returns {string|null} First resolved path or null
|
|
102
|
+
*/
|
|
103
|
+
function getBinPath(binName, env) {
|
|
104
|
+
try {
|
|
105
|
+
const which = execSync(`which ${binName}`, {
|
|
106
|
+
encoding: 'utf8',
|
|
107
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
108
|
+
env: env || process.env
|
|
109
|
+
}).trim();
|
|
110
|
+
return which || null;
|
|
111
|
+
} catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* First executable `binName` on PATH (same resolution order as a POSIX shell).
|
|
118
|
+
* @param {string} binName - CLI name
|
|
119
|
+
* @param {string} pathString - PATH value (e.g. process.env.PATH)
|
|
120
|
+
* @returns {{ candidate: string, real: string }|null} First hit or null
|
|
121
|
+
*/
|
|
122
|
+
function firstExecutableOnPath(binName, pathString) {
|
|
123
|
+
if (process.platform === 'win32') {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const dirs = (pathString || '').split(path.delimiter).filter(Boolean);
|
|
127
|
+
for (const dir of dirs) {
|
|
128
|
+
const candidate = path.join(dir, binName);
|
|
129
|
+
try {
|
|
130
|
+
const st = fs.lstatSync(candidate);
|
|
131
|
+
if (!st.isFile() && !st.isSymbolicLink()) continue;
|
|
132
|
+
fs.accessSync(candidate, fs.constants.X_OK);
|
|
133
|
+
const real = fs.realpathSync(candidate);
|
|
134
|
+
return { candidate, real };
|
|
135
|
+
} catch {
|
|
136
|
+
// continue
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @param {string} executablePath - Absolute path to CLI
|
|
144
|
+
* @returns {string|null} Trimmed --version or null
|
|
145
|
+
*/
|
|
146
|
+
function versionAtExecutablePath(executablePath) {
|
|
147
|
+
try {
|
|
148
|
+
return execFileSync(executablePath, ['--version'], {
|
|
149
|
+
encoding: 'utf8',
|
|
150
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
151
|
+
}).trim();
|
|
152
|
+
} catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Get currently installed version of primary CLI (aifabrix)
|
|
159
|
+
* @param {NodeJS.ProcessEnv} [env] - Optional env for the version probe
|
|
160
|
+
* @returns {string|null} Trimmed version or null if not on PATH
|
|
161
|
+
*/
|
|
162
|
+
function getCurrentVersion(env) {
|
|
163
|
+
return getBinVersion(PRIMARY_BIN, env);
|
|
164
|
+
}
|
|
165
|
+
|
|
45
166
|
/**
|
|
46
167
|
* Get version from local package.json
|
|
47
168
|
* @returns {string|null} Version string or null if not found
|
|
@@ -81,53 +202,192 @@ function displayVersionInfo(currentVersion, packageVersion) {
|
|
|
81
202
|
}
|
|
82
203
|
}
|
|
83
204
|
|
|
205
|
+
/**
|
|
206
|
+
* @typedef {{ name: string, path: string|null, real: string|null, version: string|null }} PathBinRow
|
|
207
|
+
*/
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @param {string[]} binNames - CLI names from package.json
|
|
211
|
+
* @returns {PathBinRow[]} Resolution rows for current PATH
|
|
212
|
+
*/
|
|
213
|
+
function collectPathResolutionRows(binNames) {
|
|
214
|
+
const rows = [];
|
|
215
|
+
if (process.platform === 'win32') {
|
|
216
|
+
for (const name of binNames) {
|
|
217
|
+
const p = getBinPath(name, process.env);
|
|
218
|
+
const version = p
|
|
219
|
+
? versionAtExecutablePath(p) || getBinVersion(name, process.env)
|
|
220
|
+
: getBinVersion(name, process.env);
|
|
221
|
+
rows.push({ name, path: p, real: p, version });
|
|
222
|
+
}
|
|
223
|
+
return rows;
|
|
224
|
+
}
|
|
225
|
+
for (const name of binNames) {
|
|
226
|
+
const hit = firstExecutableOnPath(name, process.env.PATH);
|
|
227
|
+
if (!hit) {
|
|
228
|
+
rows.push({ name, path: null, real: null, version: null });
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const version =
|
|
232
|
+
versionAtExecutablePath(hit.candidate) || getBinVersion(name, process.env);
|
|
233
|
+
rows.push({ name, path: hit.candidate, real: hit.real, version });
|
|
234
|
+
}
|
|
235
|
+
return rows;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* @param {PathBinRow[]} rows - Rows from collectPathResolutionRows
|
|
240
|
+
* @param {boolean} multipleBins - Whether package exposes more than one CLI name
|
|
241
|
+
* @returns {void}
|
|
242
|
+
*/
|
|
243
|
+
function printPathResolutionTable(rows, multipleBins) {
|
|
244
|
+
const label = multipleBins
|
|
245
|
+
? 'First match on your PATH for each command (what new programs see):'
|
|
246
|
+
: 'First match on your PATH (what new programs see):';
|
|
247
|
+
console.log(`\n${label}`);
|
|
248
|
+
for (const r of rows) {
|
|
249
|
+
if (!r.path) {
|
|
250
|
+
console.log(` ${r.name}: (not found on PATH)`);
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const ver = r.version !== null && r.version !== undefined ? r.version : '(could not run --version)';
|
|
254
|
+
const arrow = r.real !== r.path ? ` → ${r.real}` : '';
|
|
255
|
+
console.log(` ${r.name}: ${r.path}${arrow} → ${ver}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* @param {PathBinRow[]} rows - Rows from collectPathResolutionRows
|
|
261
|
+
* @param {string|null} expectedVersion - Linked package version
|
|
262
|
+
* @param {string[]} binNames - Bin names (length for multi-alias tip)
|
|
263
|
+
* @returns {void}
|
|
264
|
+
*/
|
|
265
|
+
function printPathResolutionWarnings(rows, expectedVersion, binNames) {
|
|
266
|
+
const versions = rows
|
|
267
|
+
.map((r) => r.version)
|
|
268
|
+
.filter((v) => v !== null && v !== undefined && v !== '(could not run --version)');
|
|
269
|
+
const uniq = [...new Set(versions)];
|
|
270
|
+
const mismatchAliases = uniq.length > 1;
|
|
271
|
+
const hasStaleVers =
|
|
272
|
+
Boolean(expectedVersion) &&
|
|
273
|
+
rows.some(
|
|
274
|
+
(r) => r.version !== null && r.version !== undefined && r.version !== expectedVersion
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
if (hasStaleVers) {
|
|
278
|
+
console.log(`\n⚠️ At least one command above is not ${expectedVersion} (linked package version).`);
|
|
279
|
+
console.log(' Another install is winning on PATH for that name — often an old npm global copy.');
|
|
280
|
+
console.log(' Try: pnpm run diagnose:cli');
|
|
281
|
+
console.log(` Then: npm uninstall -g ${PACKAGE_NAME}`);
|
|
282
|
+
console.log(' Put PNPM_HOME (or ~/.local/share/pnpm) before other global bin dirs in PATH if needed.');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (mismatchAliases) {
|
|
286
|
+
console.log('\n⚠️ `af` and `aifabrix` resolve to different installs on PATH.');
|
|
287
|
+
console.log(' Fix PATH as above, or if PATH looks correct, your shell may be using a stale location for one of them.');
|
|
288
|
+
console.log(' Bash: hash -r Zsh: rehash Then run both with --version again.');
|
|
289
|
+
} else if (binNames.length > 1 && expectedVersion && uniq.length === 1 && uniq[0] === expectedVersion) {
|
|
290
|
+
console.log('\nTip: Bash caches `af` and `aifabrix` separately. If your terminal shows a wrong version for only one, run: hash -r');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Report first PATH hit per bin (matches new subprocesses). Warn on mismatch vs link or between aliases.
|
|
296
|
+
* Bash/zsh cache each command name separately — `af` can stay stale while `aifabrix` updates; suggest hash -r.
|
|
297
|
+
* @param {string|null} expectedVersion - Version from the linked package (pnpm env probe)
|
|
298
|
+
* @param {string[]} binNames - All bin entries from package.json
|
|
299
|
+
* @returns {void}
|
|
300
|
+
*/
|
|
301
|
+
function reportCliAliasesOnPath(expectedVersion, binNames) {
|
|
302
|
+
if (!binNames.length) return;
|
|
303
|
+
const rows = collectPathResolutionRows(binNames);
|
|
304
|
+
printPathResolutionTable(rows, binNames.length > 1);
|
|
305
|
+
printPathResolutionWarnings(rows, expectedVersion, binNames);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Prints pnpm-specific hints when shell PATH still resolves an old binary.
|
|
310
|
+
* @param {boolean} usedPnpm - Whether link used pnpm
|
|
311
|
+
* @param {string|null} newVersion - Version after link
|
|
312
|
+
* @param {Object} [pathInfo] - Shell vs linked path probe
|
|
313
|
+
* @param {string|null} [pathInfo.versionInShell] - Version from default shell env
|
|
314
|
+
* @param {string|null} [pathInfo.linkedPath] - Path under pnpm env
|
|
315
|
+
* @returns {void}
|
|
316
|
+
*/
|
|
317
|
+
function printPnpmPathHints(usedPnpm, newVersion, pathInfo) {
|
|
318
|
+
if (!usedPnpm) return;
|
|
319
|
+
const shellVersion = pathInfo && pathInfo.versionInShell;
|
|
320
|
+
const linkedPath = pathInfo && pathInfo.linkedPath;
|
|
321
|
+
if (newVersion && shellVersion !== newVersion) {
|
|
322
|
+
console.log(`\n⚠️ Your shell is still running an older ${PRIMARY_BIN} (${shellVersion || 'unknown'}).`);
|
|
323
|
+
console.log(` The linked binary is at: ${linkedPath || 'unknown'}`);
|
|
324
|
+
console.log(' Fix: run source ~/.bashrc (or open a new terminal).');
|
|
325
|
+
console.log(' If it still shows the old version, put pnpm\'s global bin first in PATH, or run:');
|
|
326
|
+
console.log(` npm uninstall -g ${PACKAGE_NAME}`);
|
|
327
|
+
} else {
|
|
328
|
+
console.log('If you still see an old version, run: source ~/.bashrc (or open a new terminal)');
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
84
332
|
/**
|
|
85
333
|
* Display success message with version information
|
|
86
334
|
* @param {string|null} currentVersion - Version before linking
|
|
87
335
|
* @param {string|null} newVersion - Version after linking
|
|
336
|
+
* @param {boolean} [usedPnpm] - Link used pnpm
|
|
337
|
+
* @param {Object} [pathInfo] - Optional shell vs linked path info
|
|
338
|
+
* @param {string|null} [pathInfo.versionInShell] - Version from default shell env
|
|
339
|
+
* @param {string|null} [pathInfo.linkedPath] - Path under pnpm env
|
|
340
|
+
* @param {string[]} [binNames] - Bin names from package.json
|
|
88
341
|
* @returns {void}
|
|
89
342
|
*/
|
|
90
|
-
function displaySuccessMessage(currentVersion, newVersion) {
|
|
91
|
-
|
|
343
|
+
function displaySuccessMessage(currentVersion, newVersion, usedPnpm, pathInfo, binNames) {
|
|
344
|
+
const bins = binNames && binNames.length ? binNames : [PRIMARY_BIN];
|
|
345
|
+
console.log('\n✔ Successfully linked!');
|
|
92
346
|
if (currentVersion && newVersion && currentVersion !== newVersion) {
|
|
93
347
|
console.log(`📊 Version updated: ${currentVersion} → ${newVersion}`);
|
|
94
348
|
} else if (newVersion) {
|
|
95
349
|
console.log(`📊 Installed version: ${newVersion}`);
|
|
96
350
|
}
|
|
97
|
-
|
|
351
|
+
const verifyHint =
|
|
352
|
+
bins.length > 1
|
|
353
|
+
? bins.map((b) => `${b} --version`).join('" or "')
|
|
354
|
+
: `${bins[0]} --version`;
|
|
355
|
+
console.log(`Run "${verifyHint}" to verify.`);
|
|
356
|
+
if (bins.length > 1) {
|
|
357
|
+
console.log(
|
|
358
|
+
'If only one alias shows the wrong version in your terminal, clear the shell command cache (bash: hash -r, zsh: rehash).'
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
printPnpmPathHints(usedPnpm, newVersion, pathInfo);
|
|
363
|
+
reportCliAliasesOnPath(newVersion, bins);
|
|
98
364
|
}
|
|
99
365
|
|
|
100
366
|
/**
|
|
101
|
-
*
|
|
102
|
-
* @param {string}
|
|
367
|
+
* Runs global link and reports success (throws on failure).
|
|
368
|
+
* @param {string} pm - 'pnpm' or 'npm'
|
|
369
|
+
* @param {string|null} currentVersion - Version before link
|
|
370
|
+
* @param {string[]} binNames - CLI bin names
|
|
103
371
|
* @returns {void}
|
|
104
|
-
* @throws {Error} If linking fails when pnpm global bin is not configured
|
|
105
372
|
*/
|
|
106
|
-
function
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
const msg = (pnpmErr.message || String(pnpmErr));
|
|
113
|
-
if (msg.includes('global bin directory') || msg.includes('ERR_PNPM_NO_GLOBAL_BIN_DIR')) {
|
|
114
|
-
console.log(
|
|
115
|
-
'⚠️ pnpm global bin is not set up. Run "pnpm setup" and add PNPM_HOME to PATH, or we will use npm link.\n'
|
|
116
|
-
);
|
|
117
|
-
} else {
|
|
118
|
-
throw pnpmErr;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
373
|
+
function runGlobalLink(pm, currentVersion, binNames) {
|
|
374
|
+
const projectRoot = path.join(__dirname, '..');
|
|
375
|
+
const env = pm === 'pnpm' ? pnpmEnv() : undefined;
|
|
376
|
+
if (pm === 'pnpm') {
|
|
377
|
+
execSync('pnpm link --global', { stdio: 'inherit', cwd: projectRoot, env });
|
|
378
|
+
} else {
|
|
122
379
|
execSync('npm link', { stdio: 'inherit', cwd: projectRoot });
|
|
123
|
-
} catch {
|
|
124
|
-
if (!pnpmLinked) {
|
|
125
|
-
console.error(
|
|
126
|
-
'\n💡 To fix: run "pnpm setup" and add the suggested line to your shell config, then run install:local again.'
|
|
127
|
-
);
|
|
128
|
-
throw new Error('Linking failed. pnpm global bin not configured and npm link failed.');
|
|
129
|
-
}
|
|
130
380
|
}
|
|
381
|
+
|
|
382
|
+
const newVersion = getCurrentVersion(env);
|
|
383
|
+
let pathInfo;
|
|
384
|
+
if (pm === 'pnpm') {
|
|
385
|
+
pathInfo = {
|
|
386
|
+
versionInShell: getCurrentVersion(),
|
|
387
|
+
linkedPath: getBinPath(PRIMARY_BIN, env)
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
displaySuccessMessage(currentVersion, newVersion, pm === 'pnpm', pathInfo, binNames);
|
|
131
391
|
}
|
|
132
392
|
|
|
133
393
|
/**
|
|
@@ -137,23 +397,17 @@ function runPnpmLink(projectRoot) {
|
|
|
137
397
|
function installLocal() {
|
|
138
398
|
const pm = detectPackageManager();
|
|
139
399
|
const packageVersion = getPackageVersion();
|
|
400
|
+
const binNames = listCliBinNames();
|
|
140
401
|
const currentVersion = getCurrentVersion();
|
|
141
402
|
|
|
142
403
|
console.log(`Detected package manager: ${pm}\n`);
|
|
143
404
|
displayVersionInfo(currentVersion, packageVersion);
|
|
144
|
-
console.log(
|
|
405
|
+
console.log(`Linking ${PACKAGE_NAME} globally...\n`);
|
|
145
406
|
|
|
146
407
|
try {
|
|
147
|
-
|
|
148
|
-
if (pm === 'pnpm') {
|
|
149
|
-
runPnpmLink(projectRoot);
|
|
150
|
-
} else {
|
|
151
|
-
execSync('npm link', { stdio: 'inherit', cwd: projectRoot });
|
|
152
|
-
}
|
|
153
|
-
const newVersion = getCurrentVersion();
|
|
154
|
-
displaySuccessMessage(currentVersion, newVersion);
|
|
408
|
+
runGlobalLink(pm, currentVersion, binNames);
|
|
155
409
|
} catch (error) {
|
|
156
|
-
console.error('\n
|
|
410
|
+
console.error('\n✖ Failed to link package:', error.message);
|
|
157
411
|
process.exit(1);
|
|
158
412
|
}
|
|
159
413
|
}
|
|
@@ -192,7 +446,7 @@ function displayUninstallVersionInfo(currentVersion, packageVersion) {
|
|
|
192
446
|
* @returns {void}
|
|
193
447
|
*/
|
|
194
448
|
function displayUninstallSuccess(pm, currentVersion) {
|
|
195
|
-
console.log(`\n
|
|
449
|
+
console.log(`\n✔ Successfully unlinked with ${pm}!`);
|
|
196
450
|
if (currentVersion) {
|
|
197
451
|
console.log(`📊 Uninstalled version: ${currentVersion}`);
|
|
198
452
|
}
|
|
@@ -208,22 +462,20 @@ function uninstallLocal() {
|
|
|
208
462
|
const packageVersion = getPackageVersion();
|
|
209
463
|
|
|
210
464
|
console.log(`Detected package manager: ${pm}\n`);
|
|
211
|
-
|
|
212
|
-
// Show version information before unlinking
|
|
213
465
|
displayUninstallVersionInfo(currentVersion, packageVersion);
|
|
214
|
-
|
|
215
|
-
console.log('Unlinking @aifabrix/builder globally...\n');
|
|
466
|
+
console.log(`Unlinking ${PACKAGE_NAME} globally...\n`);
|
|
216
467
|
|
|
217
468
|
try {
|
|
218
469
|
if (pm === 'pnpm') {
|
|
219
|
-
|
|
470
|
+
const env = { ...pnpmEnv(), CI: 'true' };
|
|
471
|
+
runPnpmGlobalRemove(env, PACKAGE_NAME);
|
|
220
472
|
displayUninstallSuccess(pm, currentVersion);
|
|
221
473
|
} else {
|
|
222
|
-
execSync(
|
|
474
|
+
execSync(`npm unlink -g ${PACKAGE_NAME}`, { stdio: 'inherit' });
|
|
223
475
|
displayUninstallSuccess(pm, currentVersion);
|
|
224
476
|
}
|
|
225
477
|
} catch (error) {
|
|
226
|
-
console.error('\n
|
|
478
|
+
console.error('\n✖ Failed to unlink package:', error.message);
|
|
227
479
|
process.exit(1);
|
|
228
480
|
}
|
|
229
481
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* pnpm global remove with virtual-store repair retry (pnpm 9+ global layout).
|
|
6
|
+
* @fileoverview Used by install-local.js uninstall path
|
|
7
|
+
* @author AI Fabrix Team
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const { execSync } = require('child_process');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {unknown} error - Thrown from execSync
|
|
14
|
+
* @returns {boolean} True when `pnpm i -g` repair may fix the failure
|
|
15
|
+
*/
|
|
16
|
+
function isPnpmUnexpectedVirtualStoreError(error) {
|
|
17
|
+
const msg =
|
|
18
|
+
error && typeof error === 'object' && 'message' in error ? String(error.message) : String(error);
|
|
19
|
+
return msg.includes('ERR_PNPM_UNEXPECTED_VIRTUAL_STORE');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {NodeJS.ProcessEnv} env - Environment
|
|
24
|
+
* @returns {void} Nothing
|
|
25
|
+
*/
|
|
26
|
+
function repairPnpmGlobalInstall(env) {
|
|
27
|
+
execSync('pnpm i -g', { stdio: 'inherit', env });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param {NodeJS.ProcessEnv} env - pnpm env (e.g. pnpmEnv + CI)
|
|
32
|
+
* @param {string} packageName - Scoped package name to remove globally
|
|
33
|
+
* @returns {void} Nothing
|
|
34
|
+
*/
|
|
35
|
+
function runPnpmGlobalRemove(env, packageName) {
|
|
36
|
+
try {
|
|
37
|
+
execSync(`pnpm remove -g ${packageName}`, { stdio: 'inherit', env });
|
|
38
|
+
} catch (firstError) {
|
|
39
|
+
if (!isPnpmUnexpectedVirtualStoreError(firstError)) throw firstError;
|
|
40
|
+
console.log(
|
|
41
|
+
'\n⚠️ pnpm global virtual store layout mismatch. Running `pnpm i -g` to repair, then retrying remove...\n'
|
|
42
|
+
);
|
|
43
|
+
repairPnpmGlobalInstall(env);
|
|
44
|
+
execSync(`pnpm remove -g ${packageName}`, { stdio: 'inherit', env });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = { runPnpmGlobalRemove };
|
package/templates/README.md
CHANGED
|
@@ -8,7 +8,7 @@ The templates directory is organized as follows:
|
|
|
8
8
|
|
|
9
9
|
### Application Templates (for `--template` flag)
|
|
10
10
|
|
|
11
|
-
Application templates are folder-based and located under `templates/applications/`. When you use `--template <name>`, the tool looks for `templates/applications/<name>/` and copies all files from that folder to `builder/<
|
|
11
|
+
Application templates are folder-based and located under `templates/applications/`. When you use `--template <name>`, the tool looks for `templates/applications/<name>/` and copies all files from that folder to `builder/<appKey>/`.
|
|
12
12
|
|
|
13
13
|
**Example:**
|
|
14
14
|
- `templates/applications/miso-controller/` - Miso Controller application template
|
|
@@ -18,7 +18,7 @@ Application templates are folder-based and located under `templates/applications
|
|
|
18
18
|
- Template folder must exist in `templates/applications/<name>/`
|
|
19
19
|
- Template folder must contain at least one file
|
|
20
20
|
- Hidden files (starting with `.`) are skipped
|
|
21
|
-
- If a template includes a `Dockerfile`, it will be copied to `builder/<
|
|
21
|
+
- If a template includes a `Dockerfile`, it will be copied to `builder/<appKey>/Dockerfile` along with other files
|
|
22
22
|
|
|
23
23
|
### Language Templates
|
|
24
24
|
|
|
@@ -63,6 +63,19 @@ Extra workflow steps are located in `templates/github/steps/`. When you use `--g
|
|
|
63
63
|
### Health Check Configuration
|
|
64
64
|
- `{{healthCheck.path}}` - Health check endpoint path (e.g., "/health")
|
|
65
65
|
- `{{healthCheck.interval}}` - Health check interval in seconds
|
|
66
|
+
- `{{healthCheck.bashProbe}}` - When true, generated Docker Compose uses a bash TCP probe (no `curl` dependency) instead of `curl -f`.
|
|
67
|
+
|
|
68
|
+
**Why `bashProbe` exists**
|
|
69
|
+
|
|
70
|
+
Some application images intentionally do not ship with `curl` (for smaller images or stricter runtime environments). If Compose uses a `curl`-based healthcheck in those images, Docker will mark the container as **unhealthy** even when the app is actually serving traffic.
|
|
71
|
+
|
|
72
|
+
Set `healthCheck.bashProbe: true` to make Compose healthchecks work without `curl` by performing a minimal HTTP request over `/dev/tcp`.
|
|
73
|
+
|
|
74
|
+
### Traefik (Docker Compose labels)
|
|
75
|
+
|
|
76
|
+
Generated compose includes `traefik.http.routers.<app>.service=<app>` so Traefik’s Docker provider always binds the router to the in-compose service (required for HTTP-only routers when TLS terminates at nginx).
|
|
77
|
+
|
|
78
|
+
Infra Traefik is started with `--providers.docker.allowEmptyServices=true` so routes are published while a container is still in Docker’s `starting` / `unhealthy` health state (common during slow boots or when a health probe differs from real readiness).
|
|
66
79
|
|
|
67
80
|
### Service Requirements
|
|
68
81
|
- `{{requiresDatabase}}` - Database requirement flag (conditional db-init service)
|
|
@@ -5,7 +5,7 @@ app:
|
|
|
5
5
|
description: "AI Fabrix Dataplane is a secure, in-tenant integration and automation layer that supplies governed, normalized, and explainable enterprise data to AI agents. Using CIP as a declarative standard, it enforces RBAC and ABAC, executes integrations, and exposes trusted data via MCP and OpenAPI."
|
|
6
6
|
type: webapp
|
|
7
7
|
language: python # Explicitly specify Python language
|
|
8
|
-
version: 1.
|
|
8
|
+
version: 1.9.5
|
|
9
9
|
|
|
10
10
|
# Image Configuration
|
|
11
11
|
# Set tag to match your build (e.g. aifabrix build dataplane -t v1.0.0 then tag: v1.0.0)
|
|
@@ -18,6 +18,16 @@ image:
|
|
|
18
18
|
|
|
19
19
|
# Port Configuration
|
|
20
20
|
port: 3001
|
|
21
|
+
environmentScopedResources: true
|
|
22
|
+
|
|
23
|
+
# Public path behind Azure Front Door / reverse proxy (used by url://public and urls.local.yaml).
|
|
24
|
+
# Traefik: host is expanded from developer-id + remote-server (hostname of `remote-server` in ~/.aifabrix/config.yaml).
|
|
25
|
+
# Path uses pattern below plus optional /dev|/tst prefix when env-scoped resources are effective (plan 117).
|
|
26
|
+
frontDoorRouting:
|
|
27
|
+
pattern: /data/*
|
|
28
|
+
enabled: true
|
|
29
|
+
host: ${DEV_USERNAME}.${REMOTE_HOST}
|
|
30
|
+
tls: ${TLS_ENABLED}
|
|
21
31
|
|
|
22
32
|
# Azure Requirements
|
|
23
33
|
requires:
|
|
@@ -51,7 +61,6 @@ build:
|
|
|
51
61
|
context: ../.. # Docker build context (relative to builder/dataplane/)
|
|
52
62
|
dockerfile: builder/dataplane/Dockerfile # Dockerfile path (relative to project root)
|
|
53
63
|
envOutputPath: ../../.env # Copy to repo root for local dev
|
|
54
|
-
localPort: 3011 # Port for local development (different from Docker port)
|
|
55
64
|
language: python # Runtime language for template selection (typescript or python)
|
|
56
65
|
reloadStart: uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001} --reload # PORT set from port above at run time; default 3001 must match port
|
|
57
66
|
|
|
@@ -98,6 +107,47 @@ configuration:
|
|
|
98
107
|
- detailed
|
|
99
108
|
- explain
|
|
100
109
|
|
|
110
|
+
- name: TRUST_CUSTOMER_POLICY_LEVEL
|
|
111
|
+
portalInput:
|
|
112
|
+
field: select
|
|
113
|
+
label: "Trust policy level (no-policy defaults)"
|
|
114
|
+
options:
|
|
115
|
+
- strict
|
|
116
|
+
- standard
|
|
117
|
+
- relaxed
|
|
118
|
+
|
|
119
|
+
- name: TRUST_PUBLISH_GATE_ENABLED
|
|
120
|
+
portalInput:
|
|
121
|
+
field: select
|
|
122
|
+
label: "Enforce trust gate on datasource publish"
|
|
123
|
+
options:
|
|
124
|
+
- "false"
|
|
125
|
+
- "true"
|
|
126
|
+
|
|
127
|
+
- name: TRUST_PROMOTE_GATE_ENABLED
|
|
128
|
+
portalInput:
|
|
129
|
+
field: select
|
|
130
|
+
label: "Enforce trust gate on external system publish (promote scope)"
|
|
131
|
+
options:
|
|
132
|
+
- "false"
|
|
133
|
+
- "true"
|
|
134
|
+
|
|
135
|
+
- name: TRUST_RUNTIME_GATE_ENABLED
|
|
136
|
+
portalInput:
|
|
137
|
+
field: select
|
|
138
|
+
label: "Enforce trust gate on CIP execution (runtime scope)"
|
|
139
|
+
options:
|
|
140
|
+
- "false"
|
|
141
|
+
- "true"
|
|
142
|
+
|
|
143
|
+
- name: TRUST_AI_EXPOSURE_GATE_ENABLED
|
|
144
|
+
portalInput:
|
|
145
|
+
field: select
|
|
146
|
+
label: "Enforce trust gate on AI document-storage prompt generation"
|
|
147
|
+
options:
|
|
148
|
+
- "false"
|
|
149
|
+
- "true"
|
|
150
|
+
|
|
101
151
|
# -------------------------------------------------------------------------
|
|
102
152
|
# CIP Execution - Resource Limits
|
|
103
153
|
# -------------------------------------------------------------------------
|