@aifabrix/builder 2.44.6 → 2.45.5
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/cli-layout.mdc +7 -3
- package/.cursor/rules/docs-rules.mdc +3 -1
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
- package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
- package/jest.projects.js +100 -1
- package/lib/api/agent-metadata-validation.api.js +93 -0
- package/lib/api/audit-api-helpers.js +68 -0
- package/lib/api/audit.api.js +119 -0
- package/lib/api/auth-cache.api.js +44 -0
- package/lib/api/certificates.api.js +4 -4
- package/lib/api/credential.api.js +2 -2
- package/lib/api/dataplane-health.api.js +137 -0
- package/lib/api/dataplane-sync.api.js +27 -0
- package/lib/api/datasources-core.api.js +21 -18
- package/lib/api/datasources-extended.api.js +22 -22
- package/lib/api/dimensions.api.js +3 -0
- package/lib/api/external-systems.api.js +13 -13
- package/lib/api/governance-scenarios.api.js +39 -0
- package/lib/api/groups.api.js +79 -0
- package/lib/api/index.js +45 -2
- package/lib/api/pipeline.api.js +4 -4
- package/lib/api/protection.api.js +157 -0
- package/lib/api/records-bulk.api.js +30 -0
- package/lib/api/records-search-parse.js +49 -0
- package/lib/api/records-search.api.js +29 -0
- package/lib/api/types/agent-metadata-validation.types.js +67 -0
- package/lib/api/types/audit.types.js +72 -0
- package/lib/api/types/dataplane-health.types.js +27 -0
- package/lib/api/types/dimensions.types.js +2 -0
- package/lib/api/types/governance-scenarios.types.js +39 -0
- package/lib/api/types/protection.types.js +69 -0
- package/lib/api/types/records-bulk.types.js +35 -0
- package/lib/api/types/records-search.types.js +28 -0
- package/lib/api/user-groups.api.js +50 -0
- package/lib/api/users.api.js +95 -0
- package/lib/api/validation-run.api.js +3 -3
- package/lib/api/validation-runner.js +3 -3
- package/lib/api/wizard-platform.api.js +3 -3
- package/lib/api/wizard.api.js +21 -21
- package/lib/app/deploy.js +34 -19
- package/lib/app/helpers.js +3 -3
- package/lib/app/index.js +3 -3
- package/lib/app/register.js +7 -6
- package/lib/app/restart-display.js +52 -21
- package/lib/app/rotate-secret.js +7 -6
- package/lib/app/run-helpers.js +15 -8
- package/lib/app/run.js +57 -9
- package/lib/app/show-display.js +7 -0
- package/lib/app/show.js +87 -5
- package/lib/build/index.js +9 -5
- package/lib/cli/index.js +4 -2
- package/lib/cli/infra-guided.js +62 -28
- package/lib/cli/installation-log-command.js +73 -0
- package/lib/cli/setup-app.help.js +50 -2
- package/lib/cli/setup-app.js +44 -25
- package/lib/cli/setup-app.test-commands.js +80 -21
- package/lib/cli/setup-auth.js +124 -52
- package/lib/cli/setup-external-system.js +37 -3
- package/lib/cli/setup-infra-up-dataplane-action.js +111 -0
- package/lib/cli/setup-infra-up-platform-action.js +131 -0
- package/lib/cli/setup-infra.js +60 -119
- package/lib/cli/setup-platform.js +1 -1
- package/lib/cli/setup-utility-help-after.js +45 -0
- package/lib/cli/setup-utility-resolve.js +132 -0
- package/lib/cli/setup-utility.js +148 -116
- package/lib/commands/app-logs.js +81 -33
- package/lib/commands/auth-config.js +116 -18
- package/lib/commands/auth-status-dataplane-version.js +231 -0
- package/lib/commands/auth-status-display.js +94 -0
- package/lib/commands/auth-status.js +70 -6
- package/lib/commands/credential-push.js +10 -5
- package/lib/commands/datasource-load-export-cli.js +178 -0
- package/lib/commands/datasource-test-trust-cli.js +114 -0
- package/lib/commands/datasource-unified-test-cli.js +25 -17
- package/lib/commands/datasource-unified-test-cli.options.js +18 -3
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
- package/lib/commands/datasource-verify-audit-cli.js +96 -0
- package/lib/commands/datasource.js +68 -1
- package/lib/commands/dimension-value.js +43 -13
- package/lib/commands/dimension.js +38 -7
- package/lib/commands/identity-apply-sync.js +131 -0
- package/lib/commands/identity-group-cli.js +146 -0
- package/lib/commands/identity-membership-role-cache.js +175 -0
- package/lib/commands/identity-shared.js +94 -0
- package/lib/commands/identity-user-cli.js +158 -0
- package/lib/commands/identity.js +43 -0
- package/lib/commands/login.js +46 -16
- package/lib/commands/protection-cli-leaves.js +286 -0
- package/lib/commands/protection.js +50 -0
- package/lib/commands/repair.js +13 -3
- package/lib/commands/setup-modes.js +19 -6
- package/lib/commands/setup-prompts.js +41 -8
- package/lib/commands/setup.js +114 -9
- package/lib/commands/teardown.js +54 -5
- package/lib/commands/test-e2e-external.js +40 -9
- package/lib/commands/test-governance-cli-options.js +47 -0
- package/lib/commands/test-governance-command-action.js +55 -0
- package/lib/commands/test-governance-external.js +88 -0
- package/lib/commands/test-trust-cli-options.js +32 -0
- package/lib/commands/test-trust-command-action.js +118 -0
- package/lib/commands/test-trust-external.js +127 -0
- package/lib/commands/up-common.js +48 -14
- package/lib/commands/up-dataplane.js +21 -18
- package/lib/commands/up-miso.js +12 -8
- package/lib/commands/upload.js +38 -15
- package/lib/commands/wizard-core.js +3 -0
- package/lib/core/audit-logger.js +1 -34
- package/lib/core/config-admin-email.js +56 -0
- package/lib/core/config-device-dataplane.js +185 -0
- package/lib/core/config-normalize.js +60 -0
- package/lib/core/config-registered-controller-urls.js +54 -0
- package/lib/core/config.js +33 -50
- package/lib/core/secrets-ensure-infra.js +1 -1
- package/lib/core/secrets-env-content.js +86 -90
- package/lib/core/secrets-env-declarative-expand.js +170 -0
- package/lib/core/secrets-env-write.js +2 -0
- package/lib/core/secrets-load.js +106 -102
- package/lib/datasource/agent-trust-debug-log.js +45 -0
- package/lib/datasource/agent-trust-fetch.js +115 -0
- package/lib/datasource/agent-trust-map.js +101 -0
- package/lib/datasource/agent-trust-mock.js +44 -0
- package/lib/datasource/agent-trust-run.js +93 -0
- package/lib/datasource/agent-trust-timeout.js +25 -0
- package/lib/datasource/audit-evidence-display.js +80 -0
- package/lib/datasource/audit-evidence-extract-debug.js +103 -0
- package/lib/datasource/audit-evidence-extract.js +177 -0
- package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
- package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
- package/lib/datasource/audit-evidence-poll.js +109 -0
- package/lib/datasource/audit-evidence-run.js +177 -0
- package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
- package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
- package/lib/datasource/audit-evidence-verify.js +108 -0
- package/lib/datasource/bulk-loader-run-batches.js +88 -0
- package/lib/datasource/bulk-loader-service-retry.js +52 -0
- package/lib/datasource/bulk-loader-service.js +127 -0
- package/lib/datasource/capability/run-capability-dimension.js +2 -1
- package/lib/datasource/datasource-exporter-resolve.js +82 -0
- package/lib/datasource/datasource-exporter-service.js +144 -0
- package/lib/datasource/datasource-identifier.js +148 -0
- package/lib/datasource/datasource-load-export-context.js +92 -0
- package/lib/datasource/integration-context.js +6 -4
- package/lib/datasource/local-data-paths.js +145 -0
- package/lib/datasource/log-cleaner.js +241 -0
- package/lib/datasource/log-viewer.js +111 -6
- package/lib/datasource/record-file-parser.js +85 -0
- package/lib/datasource/record-mapper.js +129 -0
- package/lib/datasource/resolve-app.js +74 -55
- package/lib/datasource/test-e2e.js +26 -2
- package/lib/datasource/unified-validation-run-resolve.js +45 -12
- package/lib/datasource/unified-validation-run.js +43 -17
- package/lib/datasource/validate.js +37 -20
- package/lib/external-system/deploy.js +5 -1
- package/lib/external-system/test-system-level.js +25 -4
- package/lib/external-system/test.js +3 -1
- package/lib/governance/governance-pack-loader.js +70 -0
- package/lib/governance/governance-run-display.js +119 -0
- package/lib/identity/identity-apply-core.js +108 -0
- package/lib/identity/identity-apply-phases.js +244 -0
- package/lib/identity/identity-apply-service.js +77 -0
- package/lib/identity/identity-csv-parser.js +114 -0
- package/lib/internal/fs-real-sync.js +29 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/protection/auth-context.js +45 -0
- package/lib/protection/convert-batch.js +90 -0
- package/lib/protection/load.js +41 -0
- package/lib/protection/paths.js +158 -0
- package/lib/protection/preflight-datasource-ready.js +46 -0
- package/lib/protection/protection-create-probe-lines.js +142 -0
- package/lib/protection/protection-create-probes.js +95 -0
- package/lib/protection/protection-create-scaffold.js +281 -0
- package/lib/protection/protection-display-helpers.js +445 -0
- package/lib/protection/protection-display.js +215 -0
- package/lib/protection/protection-preset-registry.js +97 -0
- package/lib/protection/report-exit.js +62 -0
- package/lib/protection/resolve.js +202 -0
- package/lib/protection/run-commands-validate.js +130 -0
- package/lib/protection/run-commands.js +216 -0
- package/lib/protection/run-protection-create-helpers.js +134 -0
- package/lib/protection/run-protection-create-probes-flow.js +43 -0
- package/lib/protection/run-protection-create.js +191 -0
- package/lib/protection/scope.js +22 -0
- package/lib/protection/sync-after-upload.js +64 -0
- package/lib/protection/upload-batch.js +127 -0
- package/lib/protection/validate-batch.js +113 -0
- package/lib/protection/validate-local.js +65 -0
- package/lib/resolvers/dimension-file.js +29 -4
- package/lib/schema/application-schema.json +4 -0
- package/lib/schema/external-datasource.schema.json +47 -13
- package/lib/schema/flag-map-validation-run.json +2 -2
- package/lib/schema/infra.parameter.yaml +10 -0
- package/lib/schema/protection.schema.json +374 -0
- package/lib/schema/type/credential-field-registry.json +636 -0
- package/lib/schema/wizard-config.schema.json +1 -1
- package/lib/utils/agent-trust-run-display.js +231 -0
- package/lib/utils/agent-trust-run-exit.js +59 -0
- package/lib/utils/agent-trust-wait-ui.js +94 -0
- package/lib/utils/app-config-resolver.js +24 -1
- package/lib/utils/applications-config-defaults.js +206 -0
- package/lib/utils/auth-config-validator.js +2 -12
- package/lib/utils/bash-secret-env.js +1 -1
- package/lib/utils/cli-exit-codes.js +30 -0
- package/lib/utils/cli-sync-options.js +33 -0
- package/lib/utils/compose-generate-docker-compose.js +111 -6
- package/lib/utils/compose-generator.js +17 -8
- package/lib/utils/controller-url.js +50 -7
- package/lib/utils/credential-push-ui.js +90 -0
- package/lib/utils/dataplane-cli-version-gate.js +202 -0
- package/lib/utils/dataplane-cli-version-help.js +74 -0
- package/lib/utils/datasource-export-display.js +137 -0
- package/lib/utils/datasource-load-display.js +174 -0
- package/lib/utils/datasource-load-export-ui.js +120 -0
- package/lib/utils/datasource-test-run-capability-scope.js +3 -3
- package/lib/utils/datasource-test-run-display.js +3 -3
- package/lib/utils/datasource-test-run-tty-log.js +5 -1
- package/lib/utils/env-copy.js +99 -14
- package/lib/utils/env-template.js +5 -1
- package/lib/utils/health-check-url.js +18 -15
- package/lib/utils/health-check.js +7 -5
- package/lib/utils/help-builder.js +30 -24
- package/lib/utils/infra-optional-service-flags.js +69 -0
- package/lib/utils/installation-log-core.js +282 -0
- package/lib/utils/installation-log-record.js +237 -0
- package/lib/utils/installation-log.js +123 -0
- package/lib/utils/log-redaction.js +105 -0
- package/lib/utils/manifest-location.js +164 -0
- package/lib/utils/manifest-source-emit.js +184 -0
- package/lib/utils/paths.js +238 -89
- package/lib/utils/remote-secrets-loader.js +7 -1
- package/lib/utils/run-cli-flags.js +29 -0
- package/lib/utils/secrets-canonical.js +10 -3
- package/lib/utils/secrets-path.js +3 -4
- package/lib/utils/secrets-utils.js +20 -10
- package/lib/utils/semver-compare.js +127 -0
- package/lib/utils/system-builder-root.js +10 -2
- package/lib/utils/upload-pipeline-ui.js +91 -0
- package/lib/utils/url-declarative-public-base.js +80 -12
- package/lib/utils/url-declarative-resolve-build-urls.js +238 -0
- package/lib/utils/url-declarative-resolve-build.js +24 -393
- package/lib/utils/url-declarative-resolve-expand-token.js +189 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +12 -3
- package/lib/utils/url-declarative-resolve-surface-state.js +102 -0
- package/lib/utils/url-declarative-resolve.js +47 -7
- package/lib/utils/url-declarative-runtime-base-path.js +21 -1
- package/lib/utils/urls-local-registry-scan.js +103 -0
- package/lib/utils/urls-local-registry.js +161 -90
- package/lib/utils/validation-poll-ui.js +14 -7
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +3 -1
- package/templates/applications/dataplane/application.yaml +4 -0
- package/templates/applications/dataplane/env.template +13 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/applications/miso-controller/application.yaml +2 -0
- package/templates/applications/miso-controller/env.template +27 -29
- package/templates/external-system/README.md.hbs +56 -8
- package/.npmrc.token +0 -1
package/lib/cli/setup-auth.js
CHANGED
|
@@ -23,12 +23,123 @@ Examples:
|
|
|
23
23
|
const AUTH_HELP_AFTER = `
|
|
24
24
|
Without options: show auth status (same as: aifabrix auth status).
|
|
25
25
|
With --set-controller or --set-environment: write defaults to config.yaml.
|
|
26
|
+
Omit the URL on --set-controller to pick from controllers already stored in config (device logins + default).
|
|
27
|
+
For details on omitting the URL: aifabrix auth set-controller -h
|
|
26
28
|
Aliases:
|
|
27
|
-
aifabrix auth set-controller
|
|
29
|
+
aifabrix auth set-controller [url]
|
|
28
30
|
aifabrix auth set-environment <env>
|
|
29
|
-
Subcommand: auth status [--validate] for CI/scripts.
|
|
31
|
+
Subcommand: auth status [--validate] for CI/scripts (exit codes 0/1/3).
|
|
30
32
|
`;
|
|
31
33
|
|
|
34
|
+
const AUTH_STATUS_HELP_AFTER = `
|
|
35
|
+
Examples:
|
|
36
|
+
$ aifabrix auth status
|
|
37
|
+
$ aifabrix auth status --validate
|
|
38
|
+
|
|
39
|
+
Exit codes (--validate only):
|
|
40
|
+
0 Authenticated and Builder CLI meets dataplane minimum (or no minimum configured)
|
|
41
|
+
1 Not authenticated — run aifabrix login
|
|
42
|
+
3 Authenticated but Builder CLI is older than dataplane minimum
|
|
43
|
+
|
|
44
|
+
Config cache (written on status when dataplane is reachable):
|
|
45
|
+
~/.aifabrix/config.yaml → device.<controllerUrl>:
|
|
46
|
+
dataplane-version — last dataplane version from health
|
|
47
|
+
dataplane-min-cli-version — minimum Builder CLI required (when enforced)
|
|
48
|
+
|
|
49
|
+
What is blocked when CLI is too old:
|
|
50
|
+
Dataplane commands (upload, wizard, datasource upload, deploy to dataplane, …)
|
|
51
|
+
What still works:
|
|
52
|
+
Local validate, aifabrix run, up-infra, file generation without dataplane API calls
|
|
53
|
+
|
|
54
|
+
Troubleshooting:
|
|
55
|
+
• "Upgrade required" but you upgraded — run auth status again to refresh cache
|
|
56
|
+
• No min version shown — dataplane MIN_BUILDER_CLI_VERSION not set (ops)
|
|
57
|
+
• CI exit 3 — pin @aifabrix/builder version in pipeline to ≥ dataplane-min-cli-version
|
|
58
|
+
`;
|
|
59
|
+
|
|
60
|
+
const AUTH_SET_CONTROLLER_HELP_AFTER = `
|
|
61
|
+
Argument:
|
|
62
|
+
[url] Optional. When omitted, the CLI uses controllers already known in your config file
|
|
63
|
+
(the default controller value plus each device-token key). Requires an interactive TTY.
|
|
64
|
+
|
|
65
|
+
Behavior:
|
|
66
|
+
- No saved controllers: error; run aifabrix login first, or pass a URL.
|
|
67
|
+
- One saved controller: if it is already the default, prints confirmation; otherwise sets it.
|
|
68
|
+
- Several saved controllers: interactive list to choose the default.
|
|
69
|
+
- Non-interactive shell: pass the URL explicitly (piped/CI shells cannot pick without a URL).
|
|
70
|
+
|
|
71
|
+
Examples:
|
|
72
|
+
$ aifabrix auth set-controller
|
|
73
|
+
Pick default controller from config (TTY), or set the only saved one.
|
|
74
|
+
|
|
75
|
+
$ aifabrix auth set-controller http://localhost:3600
|
|
76
|
+
Set default controller to that URL (validated; same rules as aifabrix auth --set-controller).
|
|
77
|
+
|
|
78
|
+
$ aifabrix auth --set-controller
|
|
79
|
+
Same as omitting the URL on this subcommand (parent command flag).
|
|
80
|
+
`;
|
|
81
|
+
|
|
82
|
+
function createAuthStatusAction() {
|
|
83
|
+
return async(options) => {
|
|
84
|
+
try {
|
|
85
|
+
await handleAuthStatus(options);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
handleCommandError(error, 'auth status');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function createAuthParentAction() {
|
|
94
|
+
return async(options) => {
|
|
95
|
+
try {
|
|
96
|
+
const setController = options.setController || options['set-controller'];
|
|
97
|
+
const setEnvironment = options.setEnvironment || options['set-environment'];
|
|
98
|
+
if (setController || setEnvironment) {
|
|
99
|
+
await handleAuthConfig({
|
|
100
|
+
setController,
|
|
101
|
+
setEnvironment
|
|
102
|
+
});
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
await handleAuthStatus(options);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
handleCommandError(error, 'auth');
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function registerAuthSetControllerSubcommand(auth) {
|
|
114
|
+
const setControllerCmd = auth.command('set-controller [url]').description(
|
|
115
|
+
'Set config.controller to a URL, or omit the URL to pick from controllers already stored in config'
|
|
116
|
+
);
|
|
117
|
+
if (typeof setControllerCmd.summary === 'function') {
|
|
118
|
+
setControllerCmd.summary('Set or pick default controller URL in config');
|
|
119
|
+
}
|
|
120
|
+
setControllerCmd.addHelpText('after', AUTH_SET_CONTROLLER_HELP_AFTER).action(async(url) => {
|
|
121
|
+
try {
|
|
122
|
+
await handleAuthConfig({ setController: url || true });
|
|
123
|
+
} catch (error) {
|
|
124
|
+
handleCommandError(error, 'auth set-controller');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function registerAuthSetEnvironmentSubcommand(auth) {
|
|
131
|
+
auth.command('set-environment <env>')
|
|
132
|
+
.description('Set default environment in config (alias for auth --set-environment)')
|
|
133
|
+
.action(async(env) => {
|
|
134
|
+
try {
|
|
135
|
+
await handleAuthConfig({ setEnvironment: env });
|
|
136
|
+
} catch (error) {
|
|
137
|
+
handleCommandError(error, 'auth set-environment');
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
32
143
|
function setupLoginCommand(program) {
|
|
33
144
|
program.command('login')
|
|
34
145
|
.description('Sign in to Miso Controller (device or credentials flow)')
|
|
@@ -68,63 +179,24 @@ function setupLogoutCommand(program) {
|
|
|
68
179
|
}
|
|
69
180
|
|
|
70
181
|
function setupAuthSubcommands(program) {
|
|
71
|
-
const authStatusHandler = async(options) => {
|
|
72
|
-
try {
|
|
73
|
-
await handleAuthStatus(options);
|
|
74
|
-
} catch (error) {
|
|
75
|
-
handleCommandError(error, 'auth status');
|
|
76
|
-
process.exit(1);
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
182
|
const auth = program.command('auth')
|
|
80
183
|
.description('Show auth status or set default controller/environment')
|
|
81
184
|
.addHelpText('after', AUTH_HELP_AFTER)
|
|
82
|
-
.option(
|
|
185
|
+
.option(
|
|
186
|
+
'--set-controller [url]',
|
|
187
|
+
'Set default controller URL in config; omit url to choose from controllers registered in config'
|
|
188
|
+
)
|
|
83
189
|
.option('--set-environment <env>', 'Set default environment in config')
|
|
84
|
-
.action(
|
|
85
|
-
try {
|
|
86
|
-
const setController = options.setController || options['set-controller'];
|
|
87
|
-
const setEnvironment = options.setEnvironment || options['set-environment'];
|
|
88
|
-
if (setController || setEnvironment) {
|
|
89
|
-
await handleAuthConfig({
|
|
90
|
-
setController,
|
|
91
|
-
setEnvironment
|
|
92
|
-
});
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
await handleAuthStatus(options);
|
|
96
|
-
} catch (error) {
|
|
97
|
-
handleCommandError(error, 'auth');
|
|
98
|
-
process.exit(1);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
auth.command('set-controller <url>')
|
|
103
|
-
.description('Set default controller URL in config (alias for auth --set-controller)')
|
|
104
|
-
.action(async(url) => {
|
|
105
|
-
try {
|
|
106
|
-
await handleAuthConfig({ setController: url });
|
|
107
|
-
} catch (error) {
|
|
108
|
-
handleCommandError(error, 'auth set-controller');
|
|
109
|
-
process.exit(1);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
190
|
+
.action(createAuthParentAction());
|
|
112
191
|
|
|
113
|
-
auth
|
|
114
|
-
|
|
115
|
-
.action(async(env) => {
|
|
116
|
-
try {
|
|
117
|
-
await handleAuthConfig({ setEnvironment: env });
|
|
118
|
-
} catch (error) {
|
|
119
|
-
handleCommandError(error, 'auth set-environment');
|
|
120
|
-
process.exit(1);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
192
|
+
registerAuthSetControllerSubcommand(auth);
|
|
193
|
+
registerAuthSetEnvironmentSubcommand(auth);
|
|
123
194
|
|
|
124
195
|
auth.command('status')
|
|
125
196
|
.description('Show tokens/session for current controller and environment')
|
|
126
|
-
.
|
|
127
|
-
.
|
|
197
|
+
.addHelpText('after', AUTH_STATUS_HELP_AFTER)
|
|
198
|
+
.option('--validate', 'Exit 1 when not authenticated, 3 when Builder CLI < dataplane minimum, 0 otherwise (for CI/scripts)')
|
|
199
|
+
.action(createAuthStatusAction());
|
|
128
200
|
}
|
|
129
201
|
|
|
130
202
|
/**
|
|
@@ -137,4 +209,4 @@ function setupAuthCommands(program) {
|
|
|
137
209
|
setupAuthSubcommands(program);
|
|
138
210
|
}
|
|
139
211
|
|
|
140
|
-
module.exports = { setupAuthCommands };
|
|
212
|
+
module.exports = { setupAuthCommands, AUTH_STATUS_HELP_AFTER };
|
|
@@ -42,8 +42,11 @@ function setupDownloadCommand(program) {
|
|
|
42
42
|
|
|
43
43
|
function setupUploadCommand(program) {
|
|
44
44
|
program.command('upload <systemKey>')
|
|
45
|
-
.description('Validate, publish to dataplane, and register with controller (draft application)')
|
|
45
|
+
.description('Validate, publish to dataplane, and register with controller (draft application); or upload .protection batch')
|
|
46
46
|
.option('--dry-run', 'Validate and build payload only; no API calls')
|
|
47
|
+
.option('--no-sync', 'For .protection: skip datasource sync after upload')
|
|
48
|
+
.option('--json', 'For .protection: JSON output')
|
|
49
|
+
.option('--warnings-as-errors', 'For .protection: pass strict=true to dataplane validate')
|
|
47
50
|
.option('-v, --verbose', 'Run server-side pipeline validate and print warnings before publish')
|
|
48
51
|
.option('--probe', 'After publish, run dataplane runtime checks (validation/run); slower')
|
|
49
52
|
.option('--minimal', 'Print only a short readiness summary after upload')
|
|
@@ -54,6 +57,26 @@ function setupUploadCommand(program) {
|
|
|
54
57
|
)
|
|
55
58
|
.action(async(systemKey, options) => {
|
|
56
59
|
try {
|
|
60
|
+
const { isProtectionScope } = require('../protection/scope');
|
|
61
|
+
if (isProtectionScope(systemKey)) {
|
|
62
|
+
const { uploadProtectionBatchCommand } = require('../protection/upload-batch');
|
|
63
|
+
const logger = require('../utils/logger');
|
|
64
|
+
const code = await uploadProtectionBatchCommand(
|
|
65
|
+
{
|
|
66
|
+
env: options.env,
|
|
67
|
+
dryRun: options.dryRun === true,
|
|
68
|
+
noSync: options.noSync === true,
|
|
69
|
+
json: options.json === true,
|
|
70
|
+
verbose: options.verbose === true,
|
|
71
|
+
warningsAsErrors: options.warningsAsErrors === true
|
|
72
|
+
},
|
|
73
|
+
logger
|
|
74
|
+
);
|
|
75
|
+
if (code !== 0) {
|
|
76
|
+
process.exit(code);
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
57
80
|
const upload = require('../commands/upload');
|
|
58
81
|
const probeTimeout =
|
|
59
82
|
options.probeTimeout === undefined || options.probeTimeout === null
|
|
@@ -79,6 +102,17 @@ function setupDeleteCommand(program) {
|
|
|
79
102
|
.option('--force', 'Skip confirmation prompt (alias for --yes)')
|
|
80
103
|
.action(async(systemKey, options) => {
|
|
81
104
|
try {
|
|
105
|
+
const { isProtectionScope } = require('../protection/scope');
|
|
106
|
+
if (isProtectionScope(systemKey)) {
|
|
107
|
+
const logger = require('../utils/logger');
|
|
108
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
109
|
+
logger.error(
|
|
110
|
+
formatBlockingError(
|
|
111
|
+
'delete .protection is not supported. Use: aifabrix protection delete <datasourceKey>'
|
|
112
|
+
)
|
|
113
|
+
);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
82
116
|
const externalDelete = require('../external-system/delete');
|
|
83
117
|
await externalDelete.deleteExternalSystem(systemKey, options);
|
|
84
118
|
} catch (error) {
|
|
@@ -186,8 +220,8 @@ async function runTestIntegrationCommand(appName, options) {
|
|
|
186
220
|
|
|
187
221
|
function setupExternalSystemTestCommands(program) {
|
|
188
222
|
// 'test <app>' is registered in setup-app.js and dispatches by app type (builder vs external)
|
|
189
|
-
program.command('test-integration <
|
|
190
|
-
.description('Integration tests: builder in container; external via dataplane')
|
|
223
|
+
program.command('test-integration <appKey|systemKey>')
|
|
224
|
+
.description('Integration tests: builder appKey in container; external systemKey via dataplane')
|
|
191
225
|
.option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
|
|
192
226
|
.option('-v, --verbose', 'Show detailed test output')
|
|
193
227
|
.option('-d, --debug', 'Include debug output and write log to integration/<systemKey>/logs/')
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aifabrix up-dataplane` action body (keeps setup-infra.js under size limits).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview up-dataplane CLI action
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 2.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const chalk = require('chalk');
|
|
12
|
+
const logger = require('../utils/logger');
|
|
13
|
+
const { formatProgress } = require('../utils/cli-test-layout-chalk');
|
|
14
|
+
const { handleCommandError, isAuthenticationError } = require('../utils/cli-utils');
|
|
15
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
16
|
+
const { handleLogin } = require('../commands/login');
|
|
17
|
+
const { handleUpDataplane } = require('../commands/up-dataplane');
|
|
18
|
+
const { cleanBuilderAppDirs } = require('../commands/up-common');
|
|
19
|
+
const { runGuidedUpDataplane } = require('./infra-guided');
|
|
20
|
+
const { recordInfraInstallationCommand } = require('./installation-log-command');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {Object} options
|
|
24
|
+
* @returns {Promise<string[]>}
|
|
25
|
+
*/
|
|
26
|
+
async function runUpDataplaneWork(options) {
|
|
27
|
+
let cleanedAppKeys = [];
|
|
28
|
+
if (options.force) {
|
|
29
|
+
const c = await cleanBuilderAppDirs(['dataplane']);
|
|
30
|
+
cleanedAppKeys = Array.isArray(c) ? c : [];
|
|
31
|
+
}
|
|
32
|
+
if (!options.verbose) {
|
|
33
|
+
await runGuidedUpDataplane(options, handleUpDataplane);
|
|
34
|
+
} else {
|
|
35
|
+
await handleUpDataplane(options);
|
|
36
|
+
}
|
|
37
|
+
return cleanedAppKeys;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @param {Object} params
|
|
42
|
+
* @returns {Promise<void>}
|
|
43
|
+
*/
|
|
44
|
+
async function logDataplaneOutcome(params) {
|
|
45
|
+
const { options, startedAt, outcome, error, cleanedAppKeys } = params;
|
|
46
|
+
await recordInfraInstallationCommand({
|
|
47
|
+
command: 'up-dataplane',
|
|
48
|
+
options,
|
|
49
|
+
startedAt,
|
|
50
|
+
outcome,
|
|
51
|
+
error,
|
|
52
|
+
platformAppList: ['dataplane'],
|
|
53
|
+
cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @param {Object} options
|
|
59
|
+
* @param {Date} startedAt
|
|
60
|
+
* @param {string[]} cleanedAppKeys
|
|
61
|
+
* @param {string} controllerUrl
|
|
62
|
+
* @returns {Promise<void>}
|
|
63
|
+
*/
|
|
64
|
+
async function runDataplaneAuthRecovery(options, startedAt, cleanedAppKeys, controllerUrl) {
|
|
65
|
+
if (!options.verbose) {
|
|
66
|
+
logger.log(formatProgress('Authenticating...'));
|
|
67
|
+
} else {
|
|
68
|
+
logger.log(chalk.blue('\nAuthentication required. Running aifabrix login...\n'));
|
|
69
|
+
}
|
|
70
|
+
await handleLogin({ method: 'device', controller: controllerUrl, compact: !options.verbose });
|
|
71
|
+
await handleUpDataplane(options);
|
|
72
|
+
await logDataplaneOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @param {Object} options
|
|
77
|
+
* @returns {Promise<void>}
|
|
78
|
+
*/
|
|
79
|
+
async function handleUpDataplaneCliAction(options) {
|
|
80
|
+
const startedAt = new Date();
|
|
81
|
+
let cleanedAppKeys = [];
|
|
82
|
+
try {
|
|
83
|
+
cleanedAppKeys = await runUpDataplaneWork(options);
|
|
84
|
+
await logDataplaneOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (isAuthenticationError(error)) {
|
|
87
|
+
const controllerUrl = error.controllerUrl || await resolveControllerUrl();
|
|
88
|
+
try {
|
|
89
|
+
await runDataplaneAuthRecovery(options, startedAt, cleanedAppKeys, controllerUrl);
|
|
90
|
+
return;
|
|
91
|
+
} catch (loginOrRetryError) {
|
|
92
|
+
await logDataplaneOutcome({
|
|
93
|
+
options,
|
|
94
|
+
startedAt,
|
|
95
|
+
outcome: 'failure',
|
|
96
|
+
error: loginOrRetryError,
|
|
97
|
+
cleanedAppKeys
|
|
98
|
+
});
|
|
99
|
+
handleCommandError(loginOrRetryError, 'up-dataplane');
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
await logDataplaneOutcome({ options, startedAt, outcome: 'failure', error, cleanedAppKeys });
|
|
104
|
+
handleCommandError(error, 'up-dataplane');
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
module.exports = {
|
|
110
|
+
handleUpDataplaneCliAction
|
|
111
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aifabrix up-platform` action body (keeps setup-infra.js under size limits).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview up-platform CLI action
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 2.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const chalk = require('chalk');
|
|
12
|
+
const logger = require('../utils/logger');
|
|
13
|
+
const { formatProgress } = require('../utils/cli-test-layout-chalk');
|
|
14
|
+
const { handleCommandError, isAuthenticationError } = require('../utils/cli-utils');
|
|
15
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
16
|
+
const { handleLogin } = require('../commands/login');
|
|
17
|
+
const { handleUpMiso } = require('../commands/up-miso');
|
|
18
|
+
const { handleUpDataplane } = require('../commands/up-dataplane');
|
|
19
|
+
const {
|
|
20
|
+
applyUpPlatformForceConfig,
|
|
21
|
+
cleanBuilderAppDirs,
|
|
22
|
+
prepareUrlsLocalRegistryForUpPlatform
|
|
23
|
+
} = require('../commands/up-common');
|
|
24
|
+
const { runGuidedUpPlatform } = require('./infra-guided');
|
|
25
|
+
const { recordInfraInstallationCommand } = require('./installation-log-command');
|
|
26
|
+
|
|
27
|
+
const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane'];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param {Object} options
|
|
31
|
+
* @returns {Promise<string[]>}
|
|
32
|
+
*/
|
|
33
|
+
async function runUpPlatformWork(options) {
|
|
34
|
+
let cleanedAppKeys = [];
|
|
35
|
+
let platformForceCleanSummary = null;
|
|
36
|
+
if (options.force) {
|
|
37
|
+
const forceSummary = await applyUpPlatformForceConfig({ silent: !options.verbose });
|
|
38
|
+
const cleanedApps = await cleanBuilderAppDirs(PLATFORM_APPS, {
|
|
39
|
+
silent: !options.verbose
|
|
40
|
+
});
|
|
41
|
+
cleanedAppKeys = Array.isArray(cleanedApps) ? cleanedApps : [];
|
|
42
|
+
if (!options.verbose) {
|
|
43
|
+
platformForceCleanSummary = { forceSummary, cleanedApps: cleanedAppKeys };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!options.verbose) {
|
|
48
|
+
await runGuidedUpPlatform(
|
|
49
|
+
options,
|
|
50
|
+
handleUpMiso,
|
|
51
|
+
handleUpDataplane,
|
|
52
|
+
handleLogin,
|
|
53
|
+
platformForceCleanSummary
|
|
54
|
+
);
|
|
55
|
+
} else {
|
|
56
|
+
await prepareUrlsLocalRegistryForUpPlatform();
|
|
57
|
+
await handleUpMiso(options);
|
|
58
|
+
await handleUpDataplane(options);
|
|
59
|
+
}
|
|
60
|
+
return cleanedAppKeys;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {Object} params
|
|
65
|
+
* @returns {Promise<void>}
|
|
66
|
+
*/
|
|
67
|
+
async function logUpPlatformOutcome(params) {
|
|
68
|
+
const { options, startedAt, outcome, error, cleanedAppKeys } = params;
|
|
69
|
+
await recordInfraInstallationCommand({
|
|
70
|
+
command: 'up-platform',
|
|
71
|
+
options,
|
|
72
|
+
startedAt,
|
|
73
|
+
outcome,
|
|
74
|
+
error,
|
|
75
|
+
platformAppList: PLATFORM_APPS,
|
|
76
|
+
cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined,
|
|
77
|
+
upPlatformForce: options.force === true
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function maybeHandleUpPlatformAuthRetry(error, options) {
|
|
82
|
+
if (!isAuthenticationError(error)) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const controllerUrl = error.controllerUrl || await resolveControllerUrl();
|
|
86
|
+
if (!options.verbose) {
|
|
87
|
+
logger.log(formatProgress('Authenticating...'));
|
|
88
|
+
} else {
|
|
89
|
+
logger.log(chalk.blue('\nAuthentication required. Running aifabrix login...\n'));
|
|
90
|
+
}
|
|
91
|
+
await handleLogin({ method: 'device', controller: controllerUrl, compact: !options.verbose });
|
|
92
|
+
await handleUpDataplane(options);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param {Object} options
|
|
98
|
+
* @returns {Promise<void>}
|
|
99
|
+
*/
|
|
100
|
+
async function handleUpPlatformCliAction(options) {
|
|
101
|
+
const startedAt = new Date();
|
|
102
|
+
let cleanedAppKeys = [];
|
|
103
|
+
try {
|
|
104
|
+
cleanedAppKeys = await runUpPlatformWork(options);
|
|
105
|
+
await logUpPlatformOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
|
|
106
|
+
} catch (error) {
|
|
107
|
+
try {
|
|
108
|
+
if (await maybeHandleUpPlatformAuthRetry(error, options)) {
|
|
109
|
+
await logUpPlatformOutcome({ options, startedAt, outcome: 'success', cleanedAppKeys });
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
} catch (loginOrRetryError) {
|
|
113
|
+
await logUpPlatformOutcome({
|
|
114
|
+
options,
|
|
115
|
+
startedAt,
|
|
116
|
+
outcome: 'failure',
|
|
117
|
+
error: loginOrRetryError,
|
|
118
|
+
cleanedAppKeys
|
|
119
|
+
});
|
|
120
|
+
handleCommandError(loginOrRetryError, 'up-platform');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
await logUpPlatformOutcome({ options, startedAt, outcome: 'failure', error, cleanedAppKeys });
|
|
124
|
+
handleCommandError(error, 'up-platform');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports = {
|
|
130
|
+
handleUpPlatformCliAction
|
|
131
|
+
};
|